سؤال

في النموذج الأولي لقاعدة البيانات، لدي مجموعة من الحقول (مثل الاسم والوصف والحالة) المطلوبة في جداول متعددة ومختلفة وظيفيًا.

تتمتع هذه الحقول دائمًا بنفس وظيفة المستخدم النهائي للتسمية والعرض والبحث والتصفية وما إلى ذلك.فهي ليست جزءًا من قيد المفتاح الخارجي.كيف ينبغي أن يكون هذا على غرار؟

يمكنني التفكير في المتغيرات التالية:

  • يحصل كل جدول على كل هذه السمات.في هذه الحالة كيف تسميهم؟نفس الشيء، في كل جدول، أو مع بادئة اسم الجدول (مثل usrName، prodName)

  • انقلها إلى جدول السمات، وأضف مفتاحًا خارجيًا إلى الجداول "الأساسية"، مع الإشارة إلى Attributes.PK

  • كما هو مذكور أعلاه، ولكن بدلاً من المفتاح الخارجي، استخدم Attributes.PK كـ PK في الجدول الأساسي المعني أيضًا.

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

المحلول

يبدو أنك قد تبالغ في فكرة التطبيع.تذكر، إنها فكرة تقليل التكرار في عملك بيانات.يبدو أن المثال الخاص بك يشير إلى أنك قلق بشأن "التكرار" في المعلومات التعريفية لتصميم قاعدة البيانات الخاصة بك.

على الرغم من ذلك في نهاية المطاف، user.name و user.description تختلف وظائفها عن product.name و product.description, ، ويجب أن تعامل على هذا النحو.ل status, ، هذا يعتمد على ما تعنيه بذلك.يكون status مجرد مؤشر على أن سجل المنتج/المستخدم نشط أم لا؟إذا كان الأمر كذلك، فقد يكون من المنطقي تقسيم ذلك إلى جدول مختلف.

باستخدام المعلومات التي قدمتها، إذا كانت "نشطة/منتهية الصلاحية/محذوفة" مجرد إشارة إلى الحالة داخل قاعدة البيانات، فأنا أوافق بالتأكيد على بنية الجدول مثل:

users            products         status
  id               id               id
  name             name             name
  description      description
  status_id        status_id

ومع ذلك، إذا status يمكن تغييره ليمثل شيئًا مختلفًا لغويًا (على سبيل المثال، بالنسبة للمستخدمين، ربما "نشط/متقاعد/مطرود"، أقترح تقسيم ذلك حتى يثبت التصميم في المستقبل:

user_status     product_status
  id              id
  name            name

باختصار، قم بتطبيع بياناتك، وليس تصميم قاعدة البيانات الخاصة بك.

نصائح أخرى

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

order_status_types
- id
- name
- description

shipping_accounts
- id
- name
- description

orders
- order_status_type_id
- shipping_account_id

preferences
- shipping_account_id

غالبًا ما يكون التطبيع أفضل الممارسات في أي قاعدة بيانات علائقية (في حدود المعقول).

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

ومع ذلك، في بعض الحالات، لا تكون تسوية جميع البيانات مطلوبة بالضرورة لأنها تؤدي فقط إلى تعقيد الأمور، ولكن يجب أن يكون واضحًا أين يجب القيام بذلك وأين لا يجب القيام به.

أتمنى أن يساعدك هذا.

سأعطي كل جدول مجموعة الأعمدة الخاصة به، حتى لو كانت لها نفس الأسماء ومتشابهة منطقيًا.

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

إن منح كل جدول التحكم في سماته الخاصة يعزز تماسك, وهو أمر جيد.كما أنه يتجنب سؤالك حول الاتجاه الذي تتجه إليه المفاتيح الخارجية.

أما بالنسبة لتسمية الأعمدة، فليس من الضروري أو المستحسن وضع البادئات على أسماء الأعمدة.إذا قمت في أي وقت مضى بإجراء صلة تؤدي إلى ظهور أعمدة بنفس الاسم من جدولين، فاستخدم الأسماء المستعارة للتمييز بينهما.

لقد قمت دائمًا بإعطاء كل جدول رمزًا مكونًا من 3 أحرف والذي أستخدمه بعد ذلك في جميع أسماء الحقول.بهذه الطريقة، في جدول المنتج لدي prdname، prddescription، prdstatus، وفي ملف البائع لدي venname، vendescription، venstatus.عندما يتم ضم الأشياء، لا داعي للقلق بشأن نفس الحقول المسماة.

بالطبع، تحتوي جميع الجداول على حقل اسمه عادي قديم بطاقة تعريف وسيحتوي جدول المنتج على حقل يسمى venid يشير إلى حقل المعرف في جدول البائع.في هذه الحالة، لا أضع البادئة prd عليها لأن venid منطقية تمامًا وغير غامضة.

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