আমি ব্যক্তিগতভাবে এই উদ্দেশ্যে একটি বহু-টেবিল স্কিমা ব্যবহার করতে পছন্দ করি না।
- অখণ্ডতা নিশ্চিত করা শক্ত।
- এটা বজায় রাখা কঠিন।
- ফলাফলগুলি ফিল্টার করা কঠিন।
আমি একটি ডিবিফলার নমুনা সেট করেছি ।
আমার প্রস্তাবিত টেবিল স্কিমা:
CREATE TABLE #Brands
(
BrandId int NOT NULL PRIMARY KEY,
BrandName nvarchar(100) NOT NULL
);
CREATE TABLE #Clothes
(
ClothesId int NOT NULL PRIMARY KEY,
ClothesName nvarchar(100) NOT NULL
);
-- Lookup table for known attributes
--
CREATE TABLE #Attributes
(
AttrId int NOT NULL PRIMARY KEY,
AttrName nvarchar(100) NOT NULL
);
-- holds common propeties, url, price, etc.
--
CREATE TABLE #BrandsClothes
(
BrandId int NOT NULL REFERENCES #Brands(BrandId),
ClothesId int NOT NULL REFERENCES #Clothes(ClothesId),
VievingUrl nvarchar(300) NOT NULL,
Price money NOT NULL,
PRIMARY KEY CLUSTERED (BrandId, ClothesId),
INDEX IX_BrandsClothes NONCLUSTERED (ClothesId, BrandId)
);
-- holds specific and unlimited attributes
--
CREATE TABLE #BCAttributes
(
BrandId int NOT NULL REFERENCES #Brands(BrandId),
ClothesId int NOT NULL REFERENCES #Clothes(ClothesId),
AttrId int NOT NULL REFERENCES #Attributes(AttrId),
AttrValue nvarchar(300) NOT NULL,
PRIMARY KEY CLUSTERED (BrandId, ClothesId, AttrId),
INDEX IX_BCAttributes NONCLUSTERED (ClothesId, BrandId, AttrId)
);
আমাকে কিছু তথ্য সন্নিবেশ করান:
INSERT INTO #Brands VALUES
(1, 'Brand1'), (2, 'Brand2');
INSERT INTO #Clothes VALUES
(1, 'Pants'), (2, 'T-Shirt');
INSERT INTO #Attributes VALUES
(1, 'Color'), (2, 'Size'), (3, 'Shape'), (4, 'Provider'), (0, 'Custom');
INSERT INTO #BrandsClothes VALUES
(1, 1, 'http://mysite.com?B=1&C=1', 123.99),
(1, 2, 'http://mysite.com?B=1&C=2', 110.99),
(2, 1, 'http://mysite.com?B=2&C=1', 75.99),
(2, 2, 'http://mysite.com?B=2&C=2', 85.99);
INSERT INTO #BCAttributes VALUES
(1, 1, 1, 'Blue, Red, White'),
(1, 1, 2, '32, 33, 34'),
(1, 2, 1, 'Pearl, Black widow'),
(1, 2, 2, 'M, L, XL'),
(2, 1, 4, 'Levis, G-Star, Armani'),
(2, 1, 3, 'Slim fit, Regular fit, Custom fit'),
(2, 2, 4, 'G-Star, Armani'),
(2, 2, 3, 'Slim fit, Regular fit'),
(2, 2, 0, '15% Discount');
আপনার যদি সাধারণ বৈশিষ্ট্য আনার দরকার হয়:
SELECT b.BrandName, c.ClothesName, bc.VievingUrl, bc.Price
FROM #BrandsClothes bc
INNER JOIN #Brands b
ON b.BrandId = bc.BrandId
INNER JOIN #Clothes c
ON c.ClothesId = bc.ClothesId
ORDER BY bc.BrandId, bc.ClothesId;
BrandName ClothesName VievingUrl Price
--------- ----------- ------------------------- ------
Brand1 Pants http://mysite.com?B=1&C=1 123.99
Brand1 T-Shirt http://mysite.com?B=1&C=2 110.99
Brand2 Pants http://mysite.com?B=2&C=1 75.99
Brand2 T-Shirt http://mysite.com?B=2&C=2 85.99
অথবা আপনি সহজেই ব্র্যান্ডের মাধ্যমে কাপড় পেতে পারেন:
আমাকে ব্র্যান্ড 2 এর সমস্ত পোশাক দিন
SELECT c.ClothesName, b.BrandName, a.AttrName, bca.AttrValue
FROM #BCAttributes bca
INNER JOIN #BrandsClothes bc
ON bc.BrandId = bca.BrandId
AND bc.ClothesId = bca.ClothesId
INNER JOIN #Brands b
ON b.BrandId = bc.BrandId
INNER JOIN #Clothes c
ON c.ClothesId = bc.ClothesId
INNER JOIN #Attributes a
ON a.AttrId = bca.AttrId
WHERE bca.ClothesId = 2
ORDER BY bca.ClothesId, bca.BrandId, bca.AttrId;
ClothesName BrandName AttrName AttrValue
----------- --------- -------- ---------------------
T-Shirt Brand1 Color Pearl, Black widow
T-Shirt Brand1 Size M, L, XL
T-Shirt Brand2 Custom 15% Discount
T-Shirt Brand2 Shape Slim fit, Regular fit
T-Shirt Brand2 Provider G-Star, Armani
তবে আমার জন্য, এই স্কিমার অন্যতম সেরা হ'ল আপনি এটিটিবাটস দ্বারা ফিল্টার করতে পারবেন:
বৈশিষ্ট্যযুক্ত সমস্ত কাপড় আমাকে দিন: আকার
SELECT c.ClothesName, b.BrandName, a.AttrName, bca.AttrValue
FROM #BCAttributes bca
INNER JOIN #BrandsClothes bc
ON bc.BrandId = bca.BrandId
AND bc.ClothesId = bca.ClothesId
INNER JOIN #Brands b
ON b.BrandId = bc.BrandId
INNER JOIN #Clothes c
ON c.ClothesId = bc.ClothesId
INNER JOIN #Attributes a
ON a.AttrId = bca.AttrId
WHERE bca.AttrId = 2
ORDER BY bca.ClothesId, bca.BrandId, bca.AttrId;
ClothesName BrandName AttrName AttrValue
----------- --------- -------- ----------
Pants Brand1 Size 32, 33, 34
T-Shirt Brand1 Size M, L, XL
একাধিক টেবিলের স্কীমা ব্যবহার করে পূর্বের যে কোনও প্রশ্নের সীমাবদ্ধ সীমাহীন সংখ্যক টেবিল, বা এক্সএমএল বা জেএসএন ক্ষেত্রের সাথে ডিল করতে হবে।
এই স্কিমা সহ অন্য একটি বিকল্পটি হ'ল আপনি টেমপ্লেটগুলি সংজ্ঞায়িত করতে পারেন, উদাহরণস্বরূপ, আপনি একটি নতুন টেবিল ব্র্যান্ডআটার্টেম্পলেটগুলি যুক্ত করতে পারেন। প্রতিবার আপনি একটি নতুন রেকর্ড যুক্ত করার সময় আপনি এই শাখার জন্য পূর্বনির্ধারিত বৈশিষ্ট্যের একটি সেট তৈরি করতে ট্রিগার বা এসপি ব্যবহার করতে পারেন।
আমি দুঃখিত, আমি আমার ব্যাখ্যাটি আমার ইংরেজির চেয়ে বেশি পরিষ্কার বলে মনে করি।
হালনাগাদ
আমার বর্তমান উত্তরটি কোনও আরডিবিএমএসই বিবেচনা করে না works আপনার মন্তব্য অনুসারে, যদি আপনাকে বৈশিষ্ট্যগুলির মানগুলি ফিল্টার করতে হয় তবে আমি ছোট পরিবর্তনগুলি প্রস্তাব দেব suggest
এমএস-এসকিউএল পর্যন্ত অ্যারেগুলিকে অনুমতি দেয় না, আমি একই টেবিল স্কিমা তৈরি করে একটি নতুন নমুনা সেট করেছি , তবে এটিআরএলএইভিএ আরআরএ ফিল্ডের ধরণে পরিবর্তন করেছি।
প্রকৃতপক্ষে, পোস্টগ্রিস ব্যবহার করে আপনি একটি জিআইএন সূচক ব্যবহার করে এই অ্যারের সুবিধা নিতে পারেন।
(আমাকে বলতে দিন যে @ ইভানক্রোল পোস্টগ্র্রেস সম্পর্কে ভাল জ্ঞান রাখে, আমার চেয়ে অবশ্যই ভাল But তবে আমাকে আমার বিট যোগ করতে দিন))
CREATE TABLE BCAttributes
(
BrandId int NOT NULL REFERENCES Brands(BrandId),
ClothesId int NOT NULL REFERENCES Clothes(ClothesId),
AttrId int NOT NULL REFERENCES Attrib(AttrId),
AttrValue text[],
PRIMARY KEY (BrandId, ClothesId, AttrId)
);
CREATE INDEX ix_attributes on BCAttributes(ClothesId, BrandId, AttrId);
CREATE INDEX ix_gin_attributes on BCAttributes using GIN (AttrValue);
INSERT INTO BCAttributes VALUES
(1, 1, 1, '{Blue, Red, White}'),
(1, 1, 2, '{32, 33, 34}'),
(1, 2, 1, '{Pearl, Black widow}'),
(1, 2, 2, '{M, L, XL}'),
(2, 1, 4, '{Levis, G-Star, Armani}'),
(2, 1, 3, '{Slim fit, Regular fit, Custom fit}'),
(2, 2, 4, '{G-Star, Armani}'),
(2, 2, 3, '{Slim fit, Regular fit}'),
(2, 2, 0, '{15% Discount}');
এখন, আপনি অতিরিক্ত বৈশিষ্ট্যগুলির মানগুলি ব্যবহার করে অতিরিক্তভাবে জিজ্ঞাসা করতে পারেন:
আমাকে সমস্ত প্যান্টের একটি তালিকা দিন আকার: 33
AttribId = 2 AND ARRAY['33'] && bca.AttrValue
SELECT c.ClothesName, b.BrandName, a.AttrName, array_to_string(bca.AttrValue, ', ')
FROM BCAttributes bca
INNER JOIN BrandsClothes bc
ON bc.BrandId = bca.BrandId
AND bc.ClothesId = bca.ClothesId
INNER JOIN Brands b
ON b.BrandId = bc.BrandId
INNER JOIN Clothes c
ON c.ClothesId = bc.ClothesId
INNER JOIN Attrib a
ON a.AttrId = bca.AttrId
WHERE bca.AttrId = 2
AND ARRAY['33'] && bca.AttrValue
ORDER BY bca.ClothesId, bca.BrandId, bca.AttrId;
এটি ফলাফল:
clothes name | brand name | attribute | values
------------- ------------ ---------- ----------------
Pants Brand1 Size 32, 33, 34