ما هي أفضل الممارسات لهذه المشكلة (خصائص مختلفة لفئات مختلفة)?
-
03-07-2019 - |
سؤال
لدي بعض المنتجات التي تنتمي إلى بعض الفئة.
كل فئة يمكن أن يكون لها خصائص مختلفة.
على سبيل المثال ،
- الفئة السيارات له خصائص اللون, السلطة ، ...
- الفئة الحيوانات الأليفة لها خصائص الوزن, العمر, ...
عدد الفئات هو حوالي 10-15.عدد من الخصائص في كل فئة 3-15.عدد من المنتجات كبيرة جدا.
الشرط الرئيسي لهذا التطبيق هو جيد جدا البحث.سوف نقوم بتحديد الفئة ، ثم أدخل معايير كل الممتلكات في هذه الفئة.
أن تصميم قاعدة بيانات عن هذا السيناريو.(SQL Server 2005)
المحلول
التصميم الكلاسيكي النهج (النجم يدل على عمود المفتاح الأساسي):
Product
ProductId*
CategoryId: FK to Category.CategroyId
Name
Category
CategoryId*
Name
Property
PropertyId*
Name
Type
CategoryProperty
CategoryId*: FK to Category.CategoryId
PropertyId*: FK to Property.PropertyId
ProductProperty
ProductId*: FK to Product.ProductId
PropertyId*: FK to Property.PropertyId
ValueAsString
إذا كنت تستطيع العيش مع حقيقة أن كل قيمة العقار من شأنها أن تذهب إلى DB كسلسلة و تحويل نوع المعلومات المخزنة في الخاصية الجدول أن هذا التصميم سيكون كافيا.
الاستعلام من شأنه أن يذهب شيء من هذا القبيل:
SELECT
Product.ProductId,
Product.Name AS ProductName,
Category.CategoryId,
Category.Name AS CategoryName,
Property.PropertyId,
Property.Name AS PropertyName,
Property.Type AS PropertyType,
ProductProperty.ValueAsString
FROM
Product
INNER JOIN Category ON Category.CategoryId = Product.CategoryId
INENR JOIN CategoryProperty ON CategoryProperty.CategoryId = Category.CategoryId
INNER JOIN Property ON Property.PropertyId = CategoryProperty.PropertyId
INNER JOIN ProductProperty ON ProductProperty.PropertyId = Property.PropertyId
AND ProductProperty.ProductId = Product.ProductId
WHERE
Product.ProductId = 1
والمزيد من حيث ظروف العرض (كونجونكتيفيلي مثلااستخدام) ، وأسرع سيكون الاستعلام.إذا كان لديك بشكل صحيح فهرسة الجداول الخاصة بك, هذا هو.
كما هو الحل ليس مثاليا النص الكامل الفهرسة الوضع.جدول إضافي يخزن جميع النصوص المرتبطة ProductId في أكثر denormalized الطريقة يمكن أن تساعد هنا.هذا الجدول سوف تحتاج إلى تحديث من خلال المشغلات التي استمع التغييرات في ProductProperty الجدول.
نصائح أخرى
إذا كان المستخدم من التطبيق وقد لتحديد الفئة قبل أن يتمكنوا من البحث ، أود أن فصل المنتجات الخاصة بك في مختلف جداول قاعدة البيانات حسب الفئة.هذا الحل أشارت أيضا إلى حقيقة أن فئات أنفسهم لديهم القليل جدا من القواسم المشتركة.كسر ذلك حسب الفئة سوف تجعل كل البحث أسرع بكثير ، لأن الوقت لن يضيع في البحث عن طريق السيارات عندما يبحث المستخدم عن الحيوانات الأليفة.
مرة واحدة لديك منتجات تقسيم في إلى فئات ، ينبغي أن يكون من السهل إنشاء الجداول باستخدام خصائص مشتركة من المنتجات في كل فئة.واجهة المستخدم من التطبيق الخاص بك يجب أن تكون ديناميكية (أنا أفكر نموذج ويب) ، في أن خصائص يمكن للمستخدم اختيار من يجب أن تتغير عندما يقوم المستخدم بتحديد الفئة.
يرجى ملاحظة أنه إذا كان لديك المنتجات التي تريد المدرجة في فئات متعددة ، هذا الحل سيؤدي إلى تكرار البيانات في الجداول الخاصة بك.هناك مفاضلة بين سرعة تطبيع عند تصميم قاعدة البيانات.إذا كنت لا المنتجات التي تناسب فئات متعددة ، ثم أعتقد أن هذا سوف يكون أسرع حل (من حيث سرعة البحث).
معظم الناس ينصحون باستخدام أشكال مختلفة من الكيان قيمة السمة (EAV) تصميم.هذا التصميم هو مبالغة من أجل الوضع الخاص بك و يقدم مجموعة كاملة من المشاكل, على سبيل المثال:
- لا يمكنك تحديد نوع بيانات سمة;يمكنك إدخال "الموز" على عدد صحيح السمة
- لا يمكنك أن تعلن سمة إلزامية (أيغير فارغة في جدول التقليدية)
- لا يمكنك أن تعلن قيد المفتاح الخارجي على سمة
إذا كان لديك عدد قليل من الفئات ، فمن الأفضل استخدام الحل في بوجدان مكسيم الجواب.هذا هو تعريف أحد منتجات الجدول مع سمات مشتركة بين جميع فئات إضافية جدول لكل فئة لتخزين الفئة-سمات محددة.
إلا إذا كان لديك عدد لا حصر له من فئات أو إذا كان يجب أن يحتمل أن دعم مجموعة مختلفة من سمات لكل صف في المنتجات EAV حل جيد.ولكن إذا كنت لا تستخدم قواعد البيانات العلائقية في كل شيء ، منذ EAV ينتهك العديد من القواعد التطبيع.
إذا كنت حقا بحاجة إلى أن الكثير من المرونة من الأفضل تخزين البيانات في XML.في الواقع ، قد تبدو في قوات الدفاع الرواندية و الويب الدلالي أطر مثل السمسم.
قد ترغب في النظر في الكيان قيمة السمة نوع من الترتيب ، حيث يمكنك "الوسم" كل منتج مع التعسفي أزواج الاسم/القيمة من الصفات.
يمكنك أن تجرب هذا.أنا لست متأكدا من التفاصيل الفعلية من السؤال, ربما شخص يمكن أن تساعدك على ترجمة أفضل قليلا.
5 الجداول.3 لتخزين البيانات ، 2 لتخزين تعيينات بين البيانات.
tProduct
productID
<other product details>
tCategory
categoryID
<other category details>
tProperty
propertyID
<other property details>
tProductXCategory
productyID
categoryID
tCategoryXProperty
categoryID
propertyID
الاستفسارات الخاصة بك سوف تحتاج إلى الانضمام إلى البيانات باستخدام جداول, ولكن هذا سوف يسمح لك أن يكون مختلفة كثيرة إلى العديد من العلاقات بين الفئة خصائص والمنتجات.
استخدام الإجراءات المخزنة أو استعلامات بمعلمات للحصول على أفضل أداء من عمليات البحث الخاصة بك.
إذا كنت تريد أن تكون مرنة على فئات خصائص, يجب عليك إنشاء الجداول التالية:
- المنتج:ProductID
- الفئة:معرف_الفئة ، ProductID
- مكان الإقامة:PropertyID, معرف_الفئة
عندما تريد مشاركة فئة على mroe من واحد المنتج لديك لإنشاء ارتباط الجدول ن:م الانضمام:
- productCategoryPointer:ProdCatID ، ProductID ، معرف_الفئة.
سيكون لديك بعض ينضم في الاستفسارات الخاصة بك, ولكن مع الحق في الفهارس ، shoulb تكون قادرة على الاستعلام البيانات الخاصة بك بسرعة.
يمكنك أن تجرب شيئا أكثر وجوه المنحى.
1.تحديد الجدول الأساسي للمنتجات
Products(ProductID, CategoryID, <any other common properties>)
2.تحديد جدول الفئات
Categories(CategoryID, Name, Description, ..)
من هنا لديك الكثير من الخيارات و تقريبا كل منهم كسر التطبيع من قاعدة البيانات الخاصة بك.
الحل A.
سيكون maintaince كابوس إذا كنت بحاجة إلى إضافة منتجات جديدة
A1.تحديد جدول منفصل لكل فئة من الفئات
Cars(CarID, ProductID, ..)
Pets(PetID, ProductID, ..)
A2.ربط الجداول على أساس العلاقات من أجل استخدام البيانات
SELECT <fields> FROM Cars INNER JOIN Products ON Cars.ProductID = Products.ProductID
الحل B.
صيانة كابوس لأنواع مختلفة من خصائص (أيint, varchar, الخ)
B1.تحديد جدول خصائص
CategoryProperty (CPID, Name, Type)
B2.تحديد الجدول لعقد الجمعيات بين فئات وخصائص
PropertyAssociation (CPID, PropertyID)
B12.تحديد الجدول اضغط خصائص (البديل B1 و B2)
Properties(CategoryID, PropertyID, Name, Type)
B3.لكل نوع من أنواع الملكية (int, double, varchar.... الخ) إضافة قيمة الجدول
PropertyValueInt(ProductID, CPID, PropertyID, Value)
- على الباحث
PropertyValueString(ProductID, CPID, PropertyID, Value)
- سلاسل
PropertyValueMoney(ProductID, CPID, PropertyID, Value)
- من أجل المال
B4.الانضمام إلى كافة الجداول لإستعادة العقار المطلوب.
باستخدام هذا النهج سوف لا يكون لديك لإدارة جميع الخصائص في جدول منفصل ، ولكن القيمة أنواع منها.أساسا كل الجداول المعنية سيتم بحث الجداول.العيب في النظام لإستعادة كل قيمة ، عليك أن "القضية" لكل نوع القيمة.
تأخذ في الاعتبار هذه المواد (هنا و هنا) عند اختيار أي من هذه الطرق. هذا منتدى آخر هو أيضا مثيرة للاهتمام بطريقة أو بأخرى ذات الصلة بالموضوع ، على الرغم من أنها عن التعريب.
هل يمكن أيضا استخدام Tomalak الجواب و إضافة الكتابة قوية إذا كنت تشعر بالحاجة.
وقد أتيحت لي مؤخرا أن أفعل هذا و أنا م باستخدام NHibernate حيث لدي ثلاث كيانات
فئة المنتج الخيار OptionCategory
منتج لديه 1* فئات
منتج لديه 1* الخيار
خيار 1 OptionCategory
حالما يتم إعداد يمكنك استخدام Nhibernate التخزين المؤقت
هتافات