سؤال

لا بد لي من تخزين الأحداث المجدولة، (مثل أوقات الفصل الدراسي، على سبيل المثال) التي يمكن تنظيمها على أساس أسبوعي أو يومي أو شهري.يمكن أن تحدث الأحداث، على سبيل المثال، كل يوم اثنين وأربعاء، أو كل ثاني خميس من الشهر.هل هناك طريقة لتخزين هذه المعلومات في نظام RDBMS الذي يلتزم بـ 3NF؟

يحرر:هذه ليست واجبات منزلية.أقوم ببناء شيء ما مع صديق من أجل التنوير الخاص بنا ونريده في 3NF.

لأكون محددًا، أحاول تخزين الجداول الزمنية لأوقات القداس والاعتراف في أبرشيات الصليب الأحمر.يمكن جدولة هذه الأمور بعدة طرق، مثل كل يوم أحد في الساعة x أو كل ثلاثاء/خميس في وقت مختلف.في بعض الأحيان يكون هذا هو يوم الجمعة الثالث فقط من الشهر، والبعض الآخر يتم تقديمه فقط في وقت معين مرة واحدة في السنة.لا أحتاج إلى تخزين هذه المعلومات فحسب، بل أحتاج إلى الاستعلام عنها، حتى أتمكن بسرعة من الحصول على قائمة شاملة بالأوقات المتاحة في اليوم أو الأسبوع التالي أو أي شيء آخر.

أفترض أن 3NF بالمعنى الدقيق للكلمة ليس مطلبًا، ولكن سيكون من الأسهل بالنسبة لنا إذا كان كذلك ومن الأفضل تصحيحه بدلاً من تغيير مخططنا لاحقًا.

هل كانت مفيدة؟

المحلول

نعم لقد حل هذه المشكلة مع زملائي في العمل على النحو التالي:

CREATE TABLE [dbo].[Schedule](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [StartDate] [datetime] NOT NULL,
    [EndDate] [datetime] NULL
)

CREATE TABLE [dbo].[ScheduleInterval](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [ScheduleID] [int] NOT NULL,
    [ScheduleIntervalUnitID] [int] NOT NULL,
    [Interval] [smallint] NOT NULL
)

CREATE TABLE [dbo].[ScheduleIntervalUnit](
    [ID] [int] NOT NULL,
    [Name] [varchar](50) NULL
)

INSERT INTO ScheduleIntervalUnit (ID, Name)
SELECT '1' AS [ID], 'Day' AS [Name] UNION ALL
SELECT '2' AS [ID], 'Week' AS [Name] UNION ALL
SELECT '3' AS [ID], 'Month' AS [Name] 

وجدول زمني يمتد طول الوقت وتحدث فترات خلال تلك المدة الزمنية. تحدد وحدة جدول زمني لطول الفترة (أيام كما في "كل الآخرين" (2) أو "كل الثالث" (3) وما إلى ذلك)، الأسبوع (يوم من أيام الأسبوع، مثل الاثنين، الثلاثاء، الخ)، و الشهر (من السنة التقويمية). استخدام هذا يمكنك إجراء الاستفسارات والمنطق ضد قاعدة البيانات الخاصة بك لاسترداد الجداول.

إذا الجداول الخاصة بك تحتاج إلى حل أفضل - وصولا إلى الساعات والدقائق والثواني - نظرة على تنفيذ يونكس cron. بدأت أصلا في هذا الطريق، ولكن وجدت ما سبق أن يكون نهجا أكثر في التبسيط وتستعصي على من ذلك بكثير.

وهناك واحد تمتد الوقت / التاريخ - مثل فصل دراسي تعريف المدرسة ابتداء من 9 سبتمبر وتنتهي 4 نوفمبر - يمكن أن تحتوي على جداول متعددة (حتى كل يوم اثنين لفئة الفن، و "كل يوم" لفيز إد - ولكن عليك تحتاج إلى بذل المزيد من العمل للنظر في الأعياد وعطلات نهاية الأسبوع!).

نصائح أخرى

لتسجيل قواعد "التكرار الدوري"، يمكنك أن تستلهم منها crontab، باستثناء أنك لا تحتاج بالطبع إلى قيود على الدقائق والساعات، بل تحتاج إلى يوم من الأسبوع، ويوم من الشهر، وما شابه ذلك.نظرًا لأنه قد يكون هناك أكثر من يوم واحد (على سبيل المثال) في الجدول، ولأغراض NF، ستحتاج إلى جداول متوسطة نموذجية تُستخدم لتمثيل العديد من العلاقات، على سبيل المثال.واحد يحتوي على مفتاحين خارجيين فقط لكل صف (واحد لجدول الأحداث الرئيسي، وواحد لجدول أيام الأسبوع) - وبالمثل بالطبع لأيام الشهر، وما شابه.

من المفترض أن يكون لكل حدث مجدول أيضًا مدة أو فئة أو ربما موقع أو اسم أو وصف.

"ما مدى طبيعية" النموذج (بمجرد الاهتمام بـ "المجموعات" مع علاقة كثير-متعدد المذكورة أعلاه) يعتمد في الغالب على ما إذا كانت هذه السمات المختلفة تعتمد على بعضها البعض وكيف - على سبيل المثال، إذا كان كل حدث في حدث معين الفئة لها نفس المدة، ستحتاج إلى جدول مساعد منفصل بالمعرف والفئة والمدة، واستخدام المفاتيح الخارجية في هذا الجدول بدلاً من تكرار المعلومات المقترنة.ولكن مما تقوله، لا أرى أي انتهاك جوهري لقواعد الشكل العادي، باستثناء احتمالات التبعية هذه (التي ليست متأصلة في القليل الذي حددته حول جدولة الحدث).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top