একটি ডেটাবেজে ব্যবসায়িক ঘন্টা সংরক্ষণ করা


87

আমি বর্তমানে একটি ব্যবসায়ের 'ঘন্টার অপারেশন ডেটাবেজে সঞ্চয় করার সর্বোত্তম উপায়ে কাজ করার চেষ্টা করছি।

উদাহরণ স্বরূপ:

বিজনেস এ এর ​​নিম্নলিখিত ক্রিয়াকলাপের ঘন্টা রয়েছে

  • সোমবার: সকাল ৯ টা - সন্ধ্যা। টা
  • মঙ্গলবার: সকাল ৯ টা - সন্ধ্যা। টা
  • বুধবার: সকাল ৯ টা - সন্ধ্যা। টা
  • বৃহস্পতিবার: সকাল ৯ টা - সন্ধ্যা। টা
  • শুক্রবার: সকাল ৯ টা - সন্ধ্যা। টা
  • শনিবার: সকাল 9 টা - 12 মধ্যাহ্ন
  • রবিবার: বন্ধ

বর্তমানে আমার কাছে নিম্নলিখিতগুলির মতো একটি ডেটা মডেল রয়েছে

CREATE TABLE "business_hours" (
    "id" integer NOT NULL PRIMARY KEY,
    "day" varchar(16) NOT NULL,
    "open_time" time,
    "close_time" time
)

যেখানে কোডটি (ওআরএম এর মাধ্যমে) সপ্তাহের 7 দিনের পছন্দতে "দিন" সীমাবদ্ধ। নির্দিষ্ট দিনে যদি কোনও ব্যবসা বন্ধ থাকে কিনা তা পরীক্ষা করতে এটি ওপেনটাইম এবং ক্লোজ টাইম নুল কিনা তা পরীক্ষা করে। এটি একটি মধ্যবর্তী টেবিলের মাধ্যমে ব্যবসায়ের সাথে সম্পর্কিত (অনেকের সাথে অনেক সম্পর্ক)।

এই ডাটাবেস স্কিমের জন্য কারও কি কোনও পরামর্শ আছে? এটি সম্পর্কে কিছু আমার কাছে সঠিক মনে হচ্ছে না।


4
আপনার কেন বিজনেস_আর্টস টেবিল এবং বিজনেস টেবিলের মধ্যে এম-টু-এম সম্পর্ক দরকার? আপনি যদি সত্যিই একাধিক ব্যবসায়ে ব্যবসায়_ ঘন্টা একই রেকর্ড ভাগ করতে চান তবে কেন? শব্দার্থকভাবে, "সংস্থা সি দিনে টি 1 থেকে টি 2 তে ডি" কাজ করে এমনটি সত্তার চেয়ে বরং একটি মান-অবজেক্ট ... কেবলমাত্র ভাল (?) কারণটি আমি কল্পনা করতে পারি তা হল স্টোরেজ সাইজের অপ্টিমাইজেশন (ফ্লাইওয়েট প্যাটার্নের আরডিবি সংস্করণ, তাই কথা বলতে) যদি ব্যবসায়ের সংখ্যাটি বিশাল হওয়ার আশা করা হয় ...
ইয়ারিক

4
দুপুরের খাবারের বিরতি নিয়ে কী? পাবলিক ছুটির দিন কী?
মাওগ বলছেন মনিকা

উত্তর:


58

সামগ্রিকভাবে, আমি এতে কোনও ভুল দেখছি না। ব্যতীত ...

  1. আপনার দেশীয় প্রোগ্রামিং ভাষাটি (তার লাইব্রেরিতে) যে সংখ্যা নম্বরের সিস্টেম ব্যবহার করে আমি ব্যবহার করে আমি সপ্তাহের দিনটিকে পূর্ণসংখ্যার হিসাবে সংরক্ষণ করব। এটি ডাটাবেসের আকার হ্রাস করবে এবং আপনার কোড থেকে স্ট্রিং তুলনা সরিয়ে ফেলবে।

  2. আমি সম্ভবত এই টেবিলে ঠিক এখানে ব্যবসায়ের টেবিলের জন্য বিদেশী কীটি রেখে দেব। এইভাবে আপনার কোনও লিঙ্ক টেবিলের প্রয়োজন হবে না।

সুতরাং আমি অনুমান করি যে আমি এটি করব:

CREATE TABLE "business_hours" (
     "id" integer NOT NULL PRIMARY KEY,
     "business_id" integer NOT NULL FOREIGN KEY REFERENCES "businesses",
     "day" integer NOT NULL,
     "open_time" time,
     "close_time" time
)

আমার ব্যবসায়িক যুক্তিতে আমি প্রতিবন্ধকতা প্রয়োগ করব যে প্রতি "ব্যবসায়" কমপক্ষে 7 "ব্যবসায়িক সময়" থাকে। ( কমপক্ষে জন স্কিট সঠিক বলেই আপনি ছুটির সময় চাইবেন)) যদিও আপনি ব্যবসা বন্ধ থাকার দিনগুলিতে কেবল "ব্যবসায়িক সময়" রেখে এই সীমাবদ্ধতাটি শিথিল করতে চান।


4
আপনি কিভাবে 2 করবেন? দিন / সময় একই থাকলেও সমস্ত ব্যবসায়ের জন্য সমস্ত প্রবেশ রয়েছে?
ভিঙ্কো ভার্সালোভিক

7
আমি হ্যাঁ বলব। অন্যথায়, দুটি ব্যবসা একই ঘন্টা ভাগ করে নেওয়ার ক্ষেত্রে কী ঘটবে তা বিবেচনা করুন, তবে তারপরে তাদের মধ্যে একটির তাদের সময় পরিবর্তন করা দরকার। সময়টি পরিবর্তিত হয়েছে এবং আপনি একটি নতুন রেকর্ড তৈরি করতে পারেন বা বিদ্যমানটি ভাগ করা আছে কি না তার উপর নির্ভর করে এটি সম্পাদনা করতে হবে You
এরিক ফোর্বস

4
আমি একেবারে ব্যবসায়ের মধ্যে এই টেবিলের সারিগুলি ভাগ করে নেব না। এই জাতীয় ভাগ করে নেওয়া কেবল ব্যথার দিকে নিয়ে যায়। অ্যাপ্লিকেশনটির ব্যবসায়িক যুক্তি কেবলমাত্র এই প্রতিবন্ধকতাটি প্রয়োগ করতে হবে যে প্রতি ব্যবসায়ে কমপক্ষে 7 "ব্যবসায়িক ঘন্টা" রেফারেন্স রয়েছে।
ফ্রাঙ্ক ক্রুয়েজার

4
@ ভিঙ্কো: মনে রাখবেন যে মানগুলি বর্তমানে (একইরকম) একই রকম হলেও দুটি ব্যবসায়ের জন্য শুরুর সময়গুলি শব্দার্থগতভাবে পৃথক।
ড্রাগন

4
আপনি "দিন" এর জন্য 7 বিটের বিটম্যাপ ব্যবহার করতে পারেন। এইভাবে আপনাকে একই এন্ট্রিগুলি পুনরাবৃত্তি করতে হবে না উদাহরণস্বরূপ সমস্ত কর্ম দিবসে একই ব্যবসায়িক সময় থাকে, একটি প্রবেশ যথেষ্ট।
ZolaKt

29

একটি পরিস্থিতি যা এই স্কিমা দ্বারা আচ্ছাদিত নয় তা হ'ল একদিনে কয়েকটি খোলার সময়কাল। উদাহরণস্বরূপ, স্থানীয় পাব 12: 00-14: 30 এবং 17: 00-23: 00 খোলা রয়েছে।

কোনও থিয়েটার বক্স অফিস কোনও ম্যাটিনি এবং সন্ধ্যা পারফরম্যান্সের জন্য উন্মুক্ত।

সেই সময়ে আপনাকে একই সিদ্ধান্ত নিতে হবে যে আপনি একই দিনের জন্য বেশ কয়েকটি এন্ট্রি রাখতে পারেন, বা একই সারিতে বিভিন্ন ঘন্টার জন্য আপনাকে প্রতিনিধিত্ব করতে হবে কিনা।

মধ্যরাত্রি পেরিয়ে ওপেন করার সময়গুলি সম্পর্কে কী। বলুন একটি বার 19: 00-02: 00 খোলা আছে। আপনি যে সময়টি পরীক্ষা করতে চান তার সাথে আপনি খোলার এবং শেষের সময়ের তুলনা করতে পারেন নি।


আমি @ জর্ডান ফিল্ডস্টেইনের প্রস্তাব মতো কিছু করে শেষ করেছি। আমি "রাজ্যের পরিবর্তনগুলি" এর অ্যারেগুলি সঞ্চয় করি, যার মধ্যে পরিবর্তন (খোলা বা বন্ধ), সপ্তাহের দিন এবং দিনের সময় অন্তর্ভুক্ত থাকে। প্রতিটি ব্যবসায়ের জন্য এবং প্রতিদিনের মতো আমার যতগুলি "পরিবর্তন" থাকতে পারে। একটি ব্যবসা একদিন খুলতে পারে এবং পরের দিনটি বন্ধ করতে পারে, প্রতিদিন দুবার (বা x বার) খুলতে পারে, 24 ঘন্টা খোলা থাকে তবে সোমবারে বন্ধ থাকে। এটি বাস্তবায়ন করা কঠিন, তবে খুব নমনীয়।
আয়রনসিতো

সেরা উত্তরের পদ্ধতির অনুসরণ করে আমি এর পরিবর্তে দুটি কলাম যুক্ত করব business_hours: break_timeএবং break_duration। একই দিনে ২ টি বিরতি পাওয়া সত্যিই বিরল।
ফ্রেন্ডর

13

এটি আপনার জন্য কী সংরক্ষণ করতে হবে এবং বাস্তব-বিশ্বের ডেটা কেমন হতে পারে তার উপর এটি নির্ভর করে It
আপনার যদি নির্দিষ্ট সময়ে ব্যবসাটি চালু থাকে কিনা তা নির্ধারণ করতে সক্ষম হতে হবে তবে নির্ধারিতভাবে স্কিমটি জিজ্ঞাসা করা কিছুটা বিশ্রী হতে পারে। আরও গুরুত্বপূর্ণ, যদিও, হ'ল: আপনার কি কখনও ডে-ডে বন্ধের জন্য যত্ন নেওয়া প্রয়োজন?

কিছু বিকল্প অন্তর্ভুক্ত;

  • আপনার যা আছে তার মতো একটি স্কিম, তবে একই দিনের জন্য একাধিক পিরিয়ড থাকার বিকল্প রয়েছে। এটি মধ্যাহ্নভোজের বিরতি পূরণ করবে তবে কোনও ক্যোয়ারী চালানোকে বিশ্রী করে তুলবে যা আপনাকে একটি নির্দিষ্ট দিনের জন্য খোলার সময় দেয়, ব্যবহারকারীর কাছে উপস্থাপনের জন্য বলে।
  • একটি বিটম্যাপ শৈলী পদ্ধতির; 9-5- এর জন্য "000000000111111110000000"। এই পদ্ধতির খারাপ দিকটি হ'ল আপনাকে একটি নির্দিষ্ট গ্রানুলারিটি বাছাই করতে হবে, পুরো ঘন্টা বা অর্ধ ঘন্টা বা সত্যই, কয়েক মিনিট। গ্রানুলারিটি যতই সূক্ষ্ম, কোনও মানুষের জন্য ডেটা পড়ার পক্ষে তত শক্ত। আপনি এই মানটি পূর্ণসংখ্যার স্ট্রিংয়ের পরিবর্তে একক সংখ্যা হিসাবে সঞ্চয় করতে বিটওয়াইস অপারেটরগুলি ব্যবহার করতে পারেন তবে এটি আবার সুস্পষ্টভাবে ব্যাঘাত ঘটায়।

11

আমি শিখেছি যে আপনি যদি গুগল ডেটা মার্কআপ করতে চান তবে আপনার ডেটা সনাক্ত করতে আপনার এই নির্দেশিকাগুলি অনুসরণ করা উচিত:

https://schema.org/openingHours

http://schema.org/OpeningHoursSpecifications "বৈধ তারিখ" ধারণ করে, যা কিছু ব্যবসায়ের জন্য খুব দরকারী।

https://schema.org/docs/search_results.html#q=hours

প্রাথমিক কী ছাড়া আপনার ভাল হওয়া উচিত, যদি না আপনি ব্যবসায়ীদের যোগদানের টেবিলের সাথে একই ঘন্টা ভাগ করার অনুমতি না দেন - আকর্ষণীয়ভাবে অবশেষে আপনার সীমাবদ্ধ পরিমাণের সংস্থান থাকবে; আমি নিশ্চিত না যে এটি কত হবে: পি

আমার একটি প্রকল্পের সাথে আমি কলামগুলি ব্যবহার করেছি:

[uInt] বিজনেস_আইডি, [uTinyInt] দিন, [চর (11)] টাইমরেঞ্জ

আপনি যদি ওপেনিংহর্স স্পেসিফিকেশন সমর্থন করতে চান তবে আপনাকে বৈধফ্রম এবং বৈধ থ্রো যোগ করতে হবে।

সময় ব্যাপ্তি: hh: মিমি-এইচ: মিমি এর মতো ফর্ম্যাট হয়

এখানে একটি ফাংশন যা এটির বিশ্লেষণ করে, আপনি ডিবিতে আলাদা কলাম হিসাবে রাখলে আপনি কেবল একটি একক উন্মুক্ত / বন্ধকে পার্স করতে এই ফাংশনটি সংশোধন করতে পারেন।

আমার অভিজ্ঞতা থেকে আমি আপনাকে সুপারিশ করব যে আপনি এক দিনের মধ্যে একাধিকবার অনুমতি দিন, সেদিন সেগুলি স্পষ্টভাবে বন্ধ হয়ে গেছে বা 24 ঘন্টা বা 24/7 খোলা আছে কি না তা বলার জন্য অনুমতি দিন। আমি আমার বলেছিলাম যে ডিবিতে যদি কোনও দিন অনুপস্থিত থাকে তবে সেদিন ব্যবসাটি বন্ধ ছিল।

/**
 * parseTimeRange
 * parses a time range in the form of
 * '08:55-22:00'
 * @param $timeRange 'hh:mm-hh:mm' '08:55-22:00'
 * @return mixed ['hourStart'=>, 'minuteStart'=>, 'hourEnd'=>, 'minuteEnd'=>]
 */
function parseTimeRange($timeRange)
{
    // no validating just parsing
    preg_match('/(?P<hourStart>\d{1,2}):(?P<minuteStart>\d{2})-(?P<hourEnd>\d{1,2}):(?P<minuteEnd>\d{2})/', $timeRange, $matches);

    return $matches;
}

1

বেশিরভাগ ফলাফল প্রদত্ত দৃশ্যের জন্য দুর্দান্ত কাজ করে, তবে আপনার যদি এমন একাধিক দিনের সময়কাল চলতে থাকে তবে এগুলি কার্যকর হবে না। 8:00 পূর্বাহ্ণ ~ 2:00 পূর্বাহ্ন, তারপরে আমি একটি বহু সময়ের নকশা ব্যবহার করার পরামর্শ দিই।

   0: [
         id: 1,
         business_id: 1,
         open: true,
         day: 1,
         periods: [
             0: { open: 08:00, close: 23:59 }
         ]
      ],
   1: [
         id: 2,
         business_id: 1,
         open: true,
         day: 2,
         periods: [
             0: { open: 00:00, close: 02:00 }
             1: { open: 08:00, close: 23:59 }
         ]
      ]

0

বছরের মাস / মাসের / মাসের সপ্তাহের জন্য অতিরিক্ত ক্ষেত্রগুলি অন্তর্ভুক্ত করে ছুটিতে ফ্যাক্টরিং সম্পর্কে চিন্তাভাবনা করতে পারেন। মাসের সপ্তাহে কিছু ছোট ছোট সাবটলিটি থাকে "শেষ" উদাহরণস্বরূপ বছরের উপর নির্ভর করে সপ্তাহ 4 বা 5 হতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.