ما هي أفضل الممارسات لهذه المشكلة (خصائص مختلفة لفئات مختلفة)?

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

سؤال

لدي بعض المنتجات التي تنتمي إلى بعض الفئة.

كل فئة يمكن أن يكون لها خصائص مختلفة.

على سبيل المثال ،

  • الفئة السيارات له خصائص اللون, السلطة ، ...
  • الفئة الحيوانات الأليفة لها خصائص الوزن, العمر, ...

عدد الفئات هو حوالي 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 التخزين المؤقت

هتافات

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