سؤال

لنفترض أن لدي نظامًا به منتجات يمكن أن تحتوي على خيارات مختلفة من الزخرفة (أو الطباعة).

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

على سبيل المثال ، يمكن أن يكون لدي غطاء يمكن أن يحتوي على ثلاثة خيارات زخرفة مختلفة:

  1. بدون علامة
  2. طباعة لون واحد
  3. تطريز

هدفي هو محاولة تقليل أسماء خيارات الديكور التي أنشأها مستخدمو المسؤولون بحيث تكون دائمًا كما هي. IE لا أريد بعض خيارات الديكور التي تسمى "طباعة اللون 1" ثم واحد آخر يسمى "طباعة اللون One".

لذا فإن خطتي موجودة في واجهة المستخدم هي الحصول على أسماؤ من أسماء خيارات الديكور الحالية ، ولكنها تمنحهم أيضًا خيار إضافة واحدة جديدة (لحالات الحافة).

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

على سبيل المثال ، يمكن أن يكون لكل من HAT1 و HAT2 خيار تزيين التطريز ، لكن تكلفة إعداد HAT1 تبلغ 49 دولارًا وتكلفة إعداد HAT2 هي 35 دولارًا فقط.

إذن أسئلتي هي ، ما هي أفضل طريقة لتنظيم كياناتاتي؟ هل يجب أن يكون لدي ثلاثة كيانات: المنتج ، decorationoption و decorationoptionname؟ أو اثنين فقط من الكيانات: المنتج والتكرار؟

يرجى الاطلاع على أمثلة الكود لمزيد من الفهم:

  1. خيار ثلاثة كيانات
  2. خيار كيانان
هل كانت مفيدة؟

المحلول

أود أن أستخدم نهج الكيان الثلاثة ، مع بعض الاختلافات الطفيفة في الدلالات: المنتج ، والزينة ، و ProductDecoration. إنها بشكل أساسي الفكرة وراء طاولة انضمام كثيرة إلى العديد من الأشياء ، لكنك تعامل Join Costs ، حيث يمكنك تخزين معلومات إضافية.

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

<?php

class Product 
{   
    /** @OneToMany(targetEntity="ProductDecoration", mappedBy="product") */
    private $productDecorations;

}


class Decoration
{   
   /** @Column(type="string") */
   private $name;   

   /** @OneToMany(targetEntity="ProductDecoration", mappedBy="decoration") */
   private $productDecorations;
}

class ProductDecorations
{   

   /** @ManyToOne(targetEntity="Product", inversedBy="productDecorations") */
   private $product;

   /** @ManyToOne(targetEntity="Decoration", inversedBy="productDecorations") */
   private $decoration;

   /** @Column(type="integer") */
   private $setupCost;

   /** @Column(type="integer") */
   private $productionTime
}

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

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