هل يجب التعامل مع علاقة بيانات من اثنين إلى العديد من البيانات أكبر عدد ممكن من المعلومات؟

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

سؤال

لدي 2 طاولات قاعدة البيانات: فرق وألعاب.

لغرض هذا السؤال، نحن نتعامل مع فرق وألعاب كرة القدم (كرة القدم).

تتمتع كل لعبة بالضبط 2 فرق، عموما فريق منزلي وفريق بعيدا على الرغم من أن كلا الفرق في بعض الأحيان يمكن أن يكون محايدا.

سؤالي هو ما إذا كان يجب أن تمثل علاقة البيانات هذه باستخدام 2 مفاتيح أجنبية في جدول الألعاب (home_team_id، بعيدا_team_id) أو ما إذا كان يجب عليك استخدام علاقة كثيرة متعددة مع جدول Games_Teams لربط الاثنين، وفي هذه الحالة سأحتاج إليها لأيضا تخزين ما إذا كان الفريق هو المنزل أو الفريق بعيدا ويبدو رائقى قليلا.

لإضافة إلى الارتباك، أنا أستخدم orm Libs في Kohanaphp، وسوف تتوقع هؤلاء أن يسمى fk team_id أو جدول الارتباط لاحتواء 2 أعمدة فقط. إذا كانت لديك خبرة في هذه المشكلة في Kohanapp، فالرجاء ترك الرد، أي نصيحة عامة موضع تقدير كبير.

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

المحلول

إذا كنت تريد أن تكون قادرا على تحديد شارة "Xth Normal Form" في خادم قاعدة البيانات الخاص بك، فمن المحتمل أن يتم التعامل معها كأعلى كثيرة، وإلا، على خلاف ذلك، يجب أن أعتقد أنك ستقلل من استعلامك النفقات العامة مع 1 طاولة أقل أنت فقط سوف تنضم كل الوقت الذي تريد بعض البيانات المفيدة بها.

نصائح أخرى

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

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

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

ولكن التحدث واقعيا، إذا كنت لإنقاذ شيء مثل الجنس. هل سأحتاج حقا إلى ختم متعدد الولاية وضويم DateTime المرفق بهذا؟

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

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

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

يمكنني حتى أن أتخيل أن كائن معرف الفريق طبيعيا من المفتاح الأساسي للعبة.

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

أحترم إجابات الآخر في القول أن استخدام الأعمدة هو الخيار الأفضل، ومع ذلك، تذكر أنك تستخدم مكتبة أورم في كوهانا. باستخدام عمودين في جدول الألعاب، تفقد ميزات Orm للعلاقات متعددة إلى العديد من العلاقات. إذا قمت بإعداد جدول pivot games_teams، فيمكنك القيام بما يلي:

$game = ORM::factory('game', 1); // 1 is the game id

ثم يمكنك حلقة من خلال الفرق في هذه اللعبة:

foreach ($game->teams as $team) {
// do stuff with $team
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top