سؤال

أول نموذج عادي يقول هذا الصف الطلب يجب أن لا يهم.هل هذا يعني أن الجدول مع التاريخ كجزء من المفتاح ليس 1NF?على سبيل المثالالنظر في جدول من شريط الأسعار حيث التاريخ/الوقت هو جزء من PK.في هذه الحالة, يمكنك الحصول على آخر سعر طلب البيانات حسب التاريخ واختيار أعلى الصف 1.هل هذا يعني أن مقابل الوفاء 1NF تحتاج إلى تقسيم الجدول إلى:1) TickerCurrentPrice (الصف 1 في شريط) 2) TickerHistoricalPrice شكرا

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

المحلول

1NF هو جانب من طاولة يمثل علاقة, ليس من طاولة على هذا النحو.

إذا كانت علاقتك تقول ticket HAS price, ، هذا 1NF انتهاك، كما لا يمكنك تحديد ما إذا كان ticket HAS أو HAS NOT ال price من خلال النظر في سجل واحد. ستحتاج إلى إحضار جميع الأسعار على هذه التذكرة وتحديد آخر منهم، والتي تنتهك non-ordering rule التابع 1NF.

إذا كانت علاقتك تقول ticket HAD BEGUN TO COST price ON date, ، ثم في 1NF حسنا، لأن كل سجل يقول ما يقول: هذه ticket التكاليف هذه price من هذه date.

وبالتالي، نقول أن هذا الجدول لا يمتثل مع 1NF متي يمثل العلاقة الأولى، ولكن لا تمتثل عندما يمثل الثاني.

الجدول نفسه لا يزال هو نفسه، بالطبع.

هذا غير ضروري يعني أنه تحتاج إلى تقسيم جداولك.

نقطة كاملة من relational databases هو أنه يمكنك استخدام relational operators لتحويل علاقة واحدة إلى آخر.

ما هو relation من حيث RDBMSب إنه طاولة تظهر الكل مجموعات من الكل القيم المحتملة التي هي في هذه العلاقة بين أنفسهم.

على سبيل المثال، إذا كنا بحاجة إلى بناء علاقة المساواة على الأرقام الطبيعية من 1 ل 5, ، لدينا هذا الجدول:

1 1
2 2
3 3
4 4
5 5

جميع الأزواج التي تظهر في هذا الجدول هي في علاقة المساواة؛ جميع أزواج لا تظهر، ليست كذلك. نحن لا نرا (2, 3) هنا، أو (4, 5), ، لأنها ليست متساوية.

لكن لا تحتاج إلى الاحتفاظ بالزوج بأكملها في قاعدة البيانات. يمكنك الاحتفاظ بقيم واحدة بدلا من ذلك وكتابة استعلام:

SELECT n1.number, n2.number
FROM number n1, number n2
WHERE n1.number = n2.number

, ، مما يمنحك نفس النتيجة.

في الواقع، النماذج العادية تتيح لك الاحتفاظ بها أبسط ممكن الجداول العلاقة في قاعدة البيانات وبناء علاقات أكثر تعقيدا منهم باستخدام SQL استفسارات.

في حالتك، إذا كتبت استعلام (أو تحديد طريقة عرض) بالطريقة التالية:

SELECT ticket, price
FROM mytable
WHERE (ticket, date) IN (
  SELECT ticket, MAX(date)
  FROM mytable
  GROUP BY
    ticket
  )

, ، تحصل على العلاقة (ticket HAS price) من (ticket HAD BEGUN TO COST price ON dateتماما كما لو كنت تحافظ على الجدول بأكمله في قاعدة البيانات.

نصائح أخرى

لا " ، حدد...النظام من قبل..." لا تنتهك 1NF.صف (عمود) الأمر الذي ينتهك 1NF أكثر عن الحالات على غرار "حدد * من XYZ;ومن ثم اختيار الصف الثالث من أعلى العمود الرابع من اليسار".نعم, لقد رأيت DB التصاميم مثل ذلك.

ما هو المقصود هو أن يتم تسجيل بعض طلب البيانات (مثل حسب التاريخ) ثم يجب تسجيله صراحة, ، على سبيل المثال في عمود التاريخ. ماذا سيكون مخطئا سيكون له طلب فقط ضمنية في الترتيب المادي للصفوف على القرص (على افتراض أنك يمكن التحكم في ذلك على أي حال). بمعنى آخر، عليك أن تطلب من قبل بعض العمود للحصول على البيانات مرة أخرى بهذا الترتيب.

لا، فهذا يعني أنه لا يوجد ترتيب جوهري. إذا كنت تريد تاريخ آخر ما لديك select max(date) من الجدول الخاص بك.

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