ما هو مخطط جدول قاعدة البيانات الأكثر كفاءة؟

StackOverflow https://stackoverflow.com/questions/38791

  •  09-06-2019
  •  | 
  •  

سؤال

ما هو مخطط جدول قاعدة البيانات الأكثر كفاءة ولماذا؟

"Users (UserID, UserName, CompamyId)"
"Companies (CompamyId, CompanyName)"

أو

"Users (UserID, UserName)"
"Companies (CompamyId, CompanyName)"
"UserCompanies (UserID, CompamyId)"

نظرًا لحقيقة أن المستخدم والشركة لديهما علاقة فردية.

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

المحلول

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

نصائح أخرى

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

يحدد المخطط الثاني علاقة متعدد بمتعدد والتي تسمح بتعيين عدة مستخدمين لشركات متعددة.

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

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

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

SELECT userid, username, companyid, companyname
FROM companies c, users u
WHERE userid = companyid

أفضل بكثير من...

SELECT userid, username, companyid, companyname
FROM companies c, users u, usercompanies uc
WHERE u.userid = uc.userid
AND c.companyid = uc.companyid

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

الأول يعني أن المستخدم يمكن أن يكون عضوًا فقط واحد الشركة (علاقة تنتمي إلى).بينما يشير المخطط الثاني إلى أن المستخدم يمكن أن يكون عضوًا في العديد من الشركات (علاقة has_many)

إذا كنت تبحث عن مخطط يمكنه (أو سيدعم لاحقًا) علاقة has_many، فأنت تريد استخدام المخطط الثاني.للسبب قارن:

//select all users in company x with schema 1
select username, companyname from companies
inner join users on users.companyid = companies.companyid
where companies.companyid = __some_id__;

و

//select all users in company x with schema 2
select username, companyname from companies
inner join usercompanies on usercompanies.companyid = companies.companyid
inner join users on usercompanies.userid = users.userid
where companies.companyid = __some_id__;

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

أعتقد أنك تعني "عديد إلى واحد" عندما يتعلق الأمر بالمستخدمين والشركات - إلا إذا كنت تخطط لامتلاك شركة فريدة لكل مستخدم.

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

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

(ID, UserName, CompanyName)

لكنني أظن أنك تقصد حقًا أن هناك واحد لكثير العلاقة بين المستخدم والشركة - مستخدم واحد أو أكثر للشركة ولكن مستخدم واحد فقط للعلاقات العامة للشركة.في هذه الحالة يكون الحل ذو الجدولين صحيحًا.

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

لاحظ أن كفاءة ليست حقا القضية هنا.إن طبيعة البيانات هي التي تحدد الحل الذي يجب عليك استخدامه.

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