ما نوع بنية قاعدة البيانات التي يجب أن أستخدمها لموقع يحتوي على فئة فرعية لا حصر لها؟

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

سؤال

على سبيل المثال، يعد "Dole Banana" أحد أنواع المنتجات، وهو مدرج ضمن فئة "الموز"، وعندما أفتح فئة "الفواكه"، أريد رؤية "Dole Banana".

+ Food
|--+ Fruits
|------+ Bananas   
|------+ Apples
|--+ Vegetables
|------+ Onion
|------+ Spinach
هل كانت مفيدة؟

المحلول

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

وتحرير: مجرد كلمة تحذير الرغم من ذلك، تحتاج إلى إجراء عمليات الإدراج / التحديث في معاملة مقفل أو شجرة يمكن الحصول على افسدت

.

نصائح أخرى

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

وأما عن الحل، لاحظ أن لكل فئة فرعية يمكن أن يكون واحد أو صفر الفئات الأصل. لذلك، يمكن خزنها الشجرة بأكملها في الجدول refferental النفس واحد مع حقل "الأصل".

<ع> استخدام الخاص بك شجرة سبيل المثال:

 ID  | PARENT | NAME
-----+--------+-------------
  1  |  null  | Food
  2  |   1    | Fruits
  3  |   2    | Bananas
  4  |   2    | Apples
  5  |   1    | Vegetables
  6  |   5    | Onion
  7  |   5    | Spinach

جدول "الفئات" يحتوي على 3 حقول.

  1. معرف الفئة ليس فارغًا (المفتاح الأساسي)
  2. معرف فئة الوالدين فارغ
  3. اسم الفئة ليس فارغًا

للحصول على كافة فئات الجذر

select * from Categories where ParentCategoryId is null

للحصول على جميع الفئات الفرعية لبعض الفئات المحددة:

select * from Categories where ParentCategoryId = 12

هل يمكن استخدام بنية الجدول بسيط مع parent_category_id واسترداد الشجرة كلها مع العودية أو تنفيذ القيم يسار / يمين وجلب الشجرة بأكملها باستخدام بطلب مسبق طريقة شجرة اجتياز.

إذا كنت تعني عدد لا حصر له من المستويات، ثم طاولة المرجعية الذاتية التي يمكن recursed. على سبيل المثال: StuffID، StuffName، StuffParentID (FK إلى مادة خام ID)

لعدد محدود والجداول الثابتة: بين الوالدين والطفل الحفيد

    CREATE TABLE [dbo].[Category](
    [CategoryId] [int] NOT NULL,
    [ParentCategoryId] [int] NULL,
    [CategoryName] [nvarchar](50) NOT NULL,
     CONSTRAINT [PK_Category] PRIMARY KEY CLUSTERED 
    (
        [CategoryId] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON 

[PRIMARY]

GO

ALTER TABLE [dbo].[Category]  WITH CHECK ADD  CONSTRAINT [FK_Category_Category] FOREIGN KEY([ParentCategoryId])
REFERENCES [dbo].[Category] ([CategoryId])
GO

ALTER TABLE [dbo].[Category] CHECK CONSTRAINT [FK_Category_Category]
GO

لالتسلسل الهرمي لانهائية، استخدم تعديل بلاي شجرة اجتياز الخوارزمية

وهنا نهجا مختلفا التي قد تكون مفيدة لك. انها لديها اكثر قليلا تكاليف الصيانة من PARENT_ID أو LFT / نهج rght، ولكن استرجاع أسهل بكثير (وأسرع).

والموز دول يمكن أن يكون في جدول المنتجات. لديك على category_id واحد للمنتج.

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

<ع> استخدام هذا الهيكل، والعودة كافة العناصر من أي فئة سهلة وسريعة، فقط الاستعلام واحد. لا يمكنك أن تفعل هذا في نهج PARENT_ID (إلا إذا كنت رمز الصعب الآباء والكبير الآباء، الخ) إضافة فئة أمرا سهلا. تصنيف المنتج يتطلب إدراج صفوف متعددة في جدول الانضمام. حذف ونقل فئات هي اصعب قليلا.

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