أول نموذج عادي والزمانية البيانات
-
23-08-2019 - |
سؤال
أول نموذج عادي يقول هذا الصف الطلب يجب أن لا يهم.هل هذا يعني أن الجدول مع التاريخ كجزء من المفتاح ليس 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)
من الجدول الخاص بك.