একক কলাম থেকে একাধিক সারণি রেফারেন্স করার জন্য সেরা নকশা?


18

প্রস্তাবিত স্কিমা

প্রথম এবং সর্বাগ্রে, আমার পোস্ট জুড়ে রেফারেন্স দেওয়ার জন্য আমার প্রস্তাবিত স্কিমাটির একটি উদাহরণ এখানে রয়েছে:

Clothes
---------- 
ClothesID (PK) INT NOT NULL
Name VARCHAR(50) NOT NULL
Color VARCHAR(50) NOT NULL
Price DECIMAL(5,2) NOT NULL
BrandID INT NOT NULL
...

Brand_1
--------
ClothesID (FK/PK) int NOT NULL
ViewingUrl VARCHAR(50) NOT NULL
SomeOtherBrand1SpecificAttr VARCHAR(50) NOT NULL

Brand_2
--------
ClothesID (FK/PK) int NOT NULL
PhotoUrl VARCHAR(50) NOT NULL
SomeOtherBrand2SpecificAttr VARCHAR(50) NOT NULL

Brand_X
--------
ClothesID (FK/PK) int NOT NULL
SomeOtherBrandXSpecificAttr VARCHAR(50) NOT NULL

সমস্যা বিবৃতি

আমার কাছে একটি পোশাকের টেবিল রয়েছে যাতে পোশাকের কোনও নির্দিষ্ট আইটেমের বৈশিষ্ট্যগুলি বর্ণনা করার জন্য নাম, রঙ, দাম, ব্র্যান্ডিড এবং এর মতো কলাম রয়েছে ।

এখানে আমার সমস্যা: বিভিন্ন ব্র্যান্ডের পোশাকের জন্য পৃথক পৃথক তথ্য প্রয়োজন। এই জাতীয় সমস্যা মোকাবেলার জন্য সেরা অনুশীলন কোনটি?

নোট করুন যে আমার উদ্দেশ্যে, কাপড়ের প্রবেশ থেকে ব্র্যান্ড-নির্দিষ্ট তথ্য সন্ধান করা প্রয়োজন necessary কারণ আমি প্রথমে কোনও পোশাকের প্রবেশ থেকে ব্যবহারকারীর কাছে তথ্য প্রদর্শন করি , তার পরে আইটেমটি কেনার জন্য আমাকে অবশ্যই তার ব্র্যান্ড-নির্দিষ্ট তথ্য ব্যবহার করতে হবে। সংক্ষেপে, পোশাক (থেকে) এবং ব্র্যান্ড_এক্স টেবিলের মধ্যে একটি দিকনির্দেশক সম্পর্ক থাকতে হবে ।

প্রস্তাবিত / বর্তমান সমাধান

এটি মোকাবেলায়, আমি নিম্নলিখিত ডিজাইন স্কিমটি সম্পর্কে চিন্তা করেছি:

জামাকাপড় টেবিল একটি থাকবে ব্র্যান্ড কলামে আইডি 1 থেকে এক্স, এর ছোটো মানগুলি থাকতে পারে যেখানে একটি ব্র্যান্ড-নির্দিষ্ট টেবিলে একটি নির্দিষ্ট আইডি অনুরূপ। উদাহরণস্বরূপ, আইডি মান 1 টি টেবিলের ব্র্যান্ড_এর সাথে মিলিত হবে (যার কোনও ইউআরএল কলাম থাকতে পারে ), আইডি 2 ব্র্যান্ড 3 এর সাথে মিলবে (যার সরবরাহকারী কলাম থাকতে পারে ) ইত্যাদি etc.

সুতরাং কোনও নির্দিষ্ট পোশাকের প্রবেশকে তার ব্র্যান্ড-নির্দিষ্ট তথ্যের সাথে সংযুক্ত করতে, আমি কল্পনা করি অ্যাপ্লিকেশন-স্তরে যুক্তিটি এরকম কিছু দেখবে:

clothesId = <some value>
brand = query("SELECT brand FROM clothes WHERE id = clothesId")

if (brand == 1) {
    // get brand_1 attributes for given clothesId
} else if (brand == 2) {
    // get brand_2 attributes for given clothesId
} ... etc.

অন্যান্য মন্তব্য ও চিন্তাভাবনা

আমি বিসিএনএফ-তে আমার সম্পূর্ণ ডাটাবেসকে স্বাভাবিক করার চেষ্টা করছি এবং যদিও আমি এটি নিয়ে এসেছি, ফলস্বরূপ অ্যাপ্লিকেশন কোডটি আমাকে খুব উদ্বিগ্ন বোধ করে। অ্যাপ্লিকেশন স্তরের ব্যতীত সম্পর্ক প্রয়োগের কোনও উপায় নেই, এবং এইভাবে নকশাটি খুব কৃপণ বোধ করে এবং আমি প্রত্যাশা করি, খুব ত্রুটি-প্রবণ।

গবেষণা

আমি পোস্ট দেওয়ার আগে পূর্ববর্তী এন্ট্রিগুলি সন্ধান করার বিষয়টি নিশ্চিত করেছিলাম। এখানে আমি সন্ধান করতে পরিচালিত একটি নিকট-অভিন্ন সমস্যা সহ একটি পোস্ট's আমি যাইহোক এই পোস্টটি তৈরি করেছিলাম কারণ মনে হয় কেবলমাত্র সরবরাহ করা উত্তরের কোনও এসকিউএল বা ডিজাইন-ভিত্তিক সমাধান নেই (যেমন এটি ওওপি, উত্তরাধিকার এবং ইন্টারফেসের উল্লেখ করে)।

ডেটাবেস ডিজাইনের ক্ষেত্রে আমিও এক ধরণের নবজাতক এবং তাই আমি কোনও অন্তর্দৃষ্টি প্রশংসা করি।


স্ট্যাক ওভারফ্লোতে আরও সহায়ক প্রতিক্রিয়া রয়েছে বলে মনে হয়:

আমি সেখানে সমাধানগুলি উল্লেখ করেছি এবং অন্যদেরও আমার প্রশ্নটি সন্ধান করার পরামর্শ দিচ্ছে।

উপরের সরবরাহিত লিঙ্কগুলি সত্ত্বেও, আমি এখানে প্রতিক্রিয়া খুঁজছি এবং প্রদত্ত যে কোনও সমাধানের প্রশংসা করব!

আমি PostgreSQL ব্যবহার করছি।

উত্তর:


7

আমি ব্যক্তিগতভাবে এই উদ্দেশ্যে একটি বহু-টেবিল স্কিমা ব্যবহার করতে পছন্দ করি না।

  • অখণ্ডতা নিশ্চিত করা শক্ত।
  • এটা বজায় রাখা কঠিন।
  • ফলাফলগুলি ফিল্টার করা কঠিন।

আমি একটি ডিবিফলার নমুনা সেট করেছি ।

আমার প্রস্তাবিত টেবিল স্কিমা:

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

আমি এই ব্যাখ্যাটি সত্যই পছন্দ করি, তবে মনে হচ্ছে আমরা একাধিক সিএসভি একক কলামে রাখার জন্য কেবল একটি বহু-টেবিল স্কিমার ব্যবসা করছি - যদি তা বোঝা যায়। অন্যদিকে, আমি মনে করি আমার এই পদ্ধতির আরও ভাল লাগছে কারণ এটির স্কিমাতে কোনও পরিবর্তন দরকার নেই, তবে আবার এটির মতো মনে হচ্ছে আমরা সমস্যাটি অন্য কোথাও চাপছি (যথা ভেরিয়েবল-দৈর্ঘ্যের কলামগুলি রেখে)। এটি একটি সমস্যা হতে পারে; আমি যদি ডিবিতে 3 মাপের প্যান্টগুলি জিজ্ঞাসা করতে চাই? এই ধরণের সমস্যার কোনও দুর্দান্ত, পরিষ্কার সমাধান নেই। এই ধারণার জন্য কি এমন কোনও নাম রয়েছে যাতে আমি সম্ভবত এটি আরও সন্ধান করতে পারি?
তরুণরr

প্রকৃতপক্ষে ... আমি যে সমস্যার উত্থাপন করেছি তার উত্তর দেওয়ার জন্য উত্তরটি @ ইভানক্রোলের সমাধান থেকে নেওয়া যেতে পারে: যথা, সিএসভি ফর্ম্যাটে কেবল টেক্সট / STRINGS এর পরিবর্তে jsonb প্রকার ব্যবহার করে। তবে আবার - এই ধারণার কোনও নাম থাকলে দয়া করে আমাকে জানান!
তরুণরr

1
এটি হ'ল একটি সত্তা বৈশিষ্ট্য মান ধরণের সমাধান। পারফরম্যান্স এবং ভাল ডিজাইনের মধ্যে এটি কোনও খারাপ সমঝোতা নয়। যদিও এটি ট্রেড অফ। আপনি একটি ক্লিনার ডিজাইনের জন্য কিছু কর্মক্ষমতা বাণিজ্য করেন, অন্তহীন "ব্র্যান্ড_ এক্স" টেবিলগুলিতে লিখিত নয়। আপনার উল্লিখিত সবচেয়ে সাধারণ দিক থেকে পারফরম্যান্স পেনাল্টিটি ন্যূনতম হওয়া উচিত be অন্য পথে যাওয়া আরও বেদনাদায়ক হবে তবে এটি আপস। en.wikedia.org/wiki/…
জোনাথন ফাইট

4

আপনি যা বর্ণনা করছেন তা হ'ল কমপক্ষে অংশে একটি পণ্য ক্যাটালগ। আপনার কয়েকটি বৈশিষ্ট্য রয়েছে যা সমস্ত পণ্যের মধ্যে সাধারণ। এগুলি একটি ভাল স্বাভাবিক টেবিলে অন্তর্ভুক্ত।

এর বাইরে আপনার ব্র্যান্ড সুনির্দিষ্ট বৈশিষ্ট্যগুলির একটি সিরিজ রয়েছে (এবং আমি আশা করি পণ্য সুনির্দিষ্ট হতে পারে)। আপনার সিস্টেমের এই নির্দিষ্ট বৈশিষ্ট্যগুলির সাথে কী করা দরকার? আপনার কি ব্যবসায়িক যুক্তি রয়েছে যা এই বৈশিষ্টগুলির স্কিমার উপর নির্ভর করে বা আপনি কেবল তাদের "লেবেল": "মান" জোড়গুলির একটি সিরিজে তালিকাবদ্ধ করছেন?

অন্যান্য উত্তর ব্যবহার কি মূলত একটি CSV পন্থা (কিনা এই হল ইঙ্গিত করা হয় JSONবা ARRAYবা অন্যভাবে) - এই নিয়মিত রিলেশনাল স্কিমা মেটাডেটা বাইরে এবং তথ্য নিজেই মধ্যে স্কিমা সরিয়ে হ্যান্ডলিং পরিত্যাগ পন্থা।

এর জন্য একটি পোর্টেবল ডিজাইনের প্যাটার্ন রয়েছে যা সম্পর্কিত ডেটাবেসগুলি খুব ভাল ফিট করে। এটি EAV (সত্তা-বৈশিষ্ট্য-মান)। আমি নিশ্চিত যে আপনি অনেকগুলি, অনেক জায়গায় পড়েছেন যে "EAV ইভিল" (এবং এটি) read তবে, একটি নির্দিষ্ট অ্যাপ্লিকেশন রয়েছে যেখানে EAV এর সাথে সমস্যাগুলি গুরুত্বপূর্ণ নয় এবং এটি হ'ল পণ্য বৈশিষ্ট্য ক্যাটালগ।

EAV- র বিরুদ্ধে সমস্ত সাধারণ যুক্তিই কোনও পণ্য বৈশিষ্ট্য ক্যাটালগের ক্ষেত্রে প্রযোজ্য না, যেহেতু পণ্যের বৈশিষ্ট্য মানগুলি কেবলমাত্র একটি তালিকায় পুনরায় সাজানো হয় বা সবচেয়ে খারাপ ক্ষেত্রে তুলনা সারণিতে পরিণত হয়।

JSONকলামের ধরণ ব্যবহার করে ডাটাবেসের বাইরে থাকা কোনও ডেটা সীমাবদ্ধতা প্রয়োগ করার ক্ষমতা গ্রহণ করে এবং এটি আপনার প্রয়োগের যুক্তিতে জোর করে। এছাড়াও, প্রতিটি ব্র্যান্ডের জন্য একটি বৈশিষ্ট্য সারণী ব্যবহারের নিম্নলিখিত অসুবিধা রয়েছে:

  • আপনার যদি শেষ পর্যন্ত কয়েকশ ব্র্যান্ড (বা আরও বেশি) থাকে তবে এটি ভাল স্কেল করে না।
  • আপনি যদি কোনও ব্র্যান্ডের অনুমতিযোগ্য বৈশিষ্ট্যগুলি পরিবর্তন করেন তবে আপনাকে ব্র্যান্ডের ক্ষেত্র নিয়ন্ত্রণের টেবিলের মধ্যে কেবল সারি যুক্ত বা সরিয়ে ফেলার পরিবর্তে একটি টেবিল সংজ্ঞা পরিবর্তন করতে হবে।
  • ব্র্যান্ডের যদি অনেকগুলি সম্ভাব্য বৈশিষ্ট্য থাকে তবে কেবলমাত্র একটি ছোট উপসেটই এটি পরিচিত তবে আপনি খুব কম জনবহুল টেবিলগুলি দিয়ে শেষ করতে পারেন।

ব্র্যান্ড-নির্দিষ্ট বৈশিষ্ট্যযুক্ত কোনও পণ্য সম্পর্কে ডেটা পুনরুদ্ধার করা বিশেষত কঠিন নয়। ইএভি মডেলটি টেবিল-প্রতি-বিভাগের মডেলটি ব্যবহার করার চেয়ে গতিশীল এসকিউএল তৈরি করা তর্কযোগ্যভাবে সহজ। টেবিল-প্রতি-বিভাগে, JSONবৈশিষ্ট্যের কলামের নামগুলি কী তা জানতে আপনার প্রতিবিম্ব (বা আপনার ) প্রয়োজন । তারপরে আপনি যেখানে আইটেমের একটি তালিকা তৈরি করতে পারেন যেখানে ধারা। EAV মডেলটিতে, WHERE X AND Y AND Zহয়ে ওঠে INNER JOIN X INNER JOIN Y INNER JOIN Z, তাই ক্যোয়ারিটি আরও কিছুটা জটিল, তবে ক্যোয়ারীটি তৈরি করার যুক্তিটি এখনও সম্পূর্ণ টেবিল-চালিত এবং আপনার যদি যথাযথ সূচকগুলি তৈরি করে থাকে তবে এটি যথেষ্ট পরিমাণে স্কেলযোগ্য হবে।

সাধারণ পদ্ধতির হিসাবে ইএভি ব্যবহার না করার অনেক কারণ রয়েছে। এই কারণগুলি কোনও পণ্য বৈশিষ্ট্য ক্যাটালগের ক্ষেত্রে প্রযোজ্য না তাই এই নির্দিষ্ট অ্যাপ্লিকেশনে EAV এর সাথে কোনও ভুল নেই।

নিশ্চিত হতেই, এটি একটি জটিল এবং বিতর্কিত বিষয়ের জন্য একটি সংক্ষিপ্ত উত্তর। আমি এর আগে একই ধরণের প্রশ্নের উত্তর দিয়েছি এবং ইএভি-র সাধারণ বিপর্যয় সম্পর্কে আরও বিশদে গিয়েছি। উদাহরণ স্বরূপ:

আমি বলব যে বেশিরভাগ ভাল কারণেই ইএভি আগের বারের চেয়ে কম ব্যবহৃত হয়। তবে আমি মনে করি এটিও ভালভাবে বোঝা যায় না।


3

এখানে আমার সমস্যা: বিভিন্ন ব্র্যান্ডের পোশাকের জন্য পৃথক পৃথক তথ্য প্রয়োজন। এই জাতীয় সমস্যা মোকাবেলার জন্য সেরা অনুশীলন কোনটি?

JSON এবং PostgreSQL ব্যবহার করে

আমি মনে করি আপনি এটি তৈরি করার প্রয়োজনের তুলনায় আরও শক্ত করে তুলছেন এবং পরে এটির সাথে আপনাকে কামড় দেবে। আপনি প্রয়োজন হবে না সত্তা-অ্যাট্রিবিউট মান মডেল যদি না আপনি আসলে EAV প্রয়োজন।

CREATE TABLE brands (
  brand_id     serial PRIMARY KEY,
  brand_name   text,
  attributes   jsonb
);
CREATE TABLE clothes (
  clothes_id   serial        PRIMARY KEY,
  brand_id     int           NOT NULL REFERENCES brands,
  clothes_name text          NOT NULL,
  color        text,
  price        numeric(5,2)  NOT NULL
);

এই স্কিমার সাথে একেবারেই ভুল কিছু নেই।

INSERT INTO brands (brand_name, attributes)
VALUES
  ( 'Gucci', $${"luxury": true, "products": ["purses", "tawdry bougie thing"]}$$ ),
  ( 'Hugo Boss', $${"origin": "Germany", "known_for": "Designing uniforms"}$$ ),
  ( 'Louis Vuitton', $${"origin": "France", "known_for": "Designer Purses"}$$ ),
  ( 'Coco Chanel', $${"known_for": "Spying", "smells_like": "Banana", "luxury": true}$$ )
;

INSERT INTO clothes (brand_id, clothes_name, color, price) VALUES
  ( 1, 'Purse', 'orange', 100 ),
  ( 2, 'Underwear', 'Gray', 10 ),
  ( 2, 'Boxers', 'Gray', 10 ),
  ( 3, 'Purse with Roman Numbers', 'Brown', 10 ),
  ( 4, 'Spray', 'Clear', 100 )
;

এখন আপনি একটি সাধারণ যোগদান ব্যবহার করে এটিকে জিজ্ঞাসা করতে পারেন

SELECT *
FROM brands
JOIN clothes
  USING (brand_id);

এবং জেএসএন অপারেটরগুলির মধ্যে যে কোনও একটি যেখানে একটি ধারাতে কাজ করে।

SELECT *
FROM brands
JOIN clothes
  USING (brand_id)
WHERE attributes->>'known_for' ILIKE '%Design%';

পার্শ্ব নোট হিসাবে, ইউআরএলগুলি ডাটাবেসে রাখবেন না। সময়ের সাথে সাথে তারা পরিবর্তন হয়। কেবল তাদের এমন ফাংশন তৈরি করুন যা সেগুলি গ্রহণ করে।

generate_url_brand( brand_id );
generate_url_clothes( clothes_id );

বা যাই হোক না কেন. আপনি যদি PostgreSQL ব্যবহার করেন তবে আপনি হ্যাশডগুলিও ব্যবহার করতে পারেন ।

বিশেষ নোটের jsonbপাশাপাশি, বাইনারি হিসাবে সংরক্ষণ করা হয় (সুতরাং -'বি ') এবং এটি সূচক-সক্ষম, বা এসআরজেবল বা শীতল বাচ্চাগুলি যা আজকাল এটি ডাকছে:CREATE INDEX ON brands USING gin ( attributes );

এখানে পার্থক্যটি ক্যোয়ারির সরলতায় ..

আমাকে ব্র্যান্ড 2 এর সমস্ত পোশাক দিন

SELECT * FROM clothes WHERE brand_id = 2;

বৈশিষ্ট্যযুক্ত সমস্ত কাপড় আমাকে দিন: আকার

SELECT * FROM clothes WHERE attributes ? 'size';

কীভাবে আলাদা ...

বড় আকারে যে কোনও পোশাকের জন্য আমাকে সমস্ত পোশাক এবং বৈশিষ্ট্য দিন।

SELECT * FROM clothes WHERE attributes->>'size' = 'large';

সুতরাং, আমি যদি সঠিকভাবে বুঝতে পারি তবে আপনি যা বলেছিলেন তার সংক্ষিপ্তসারটি হ'ল যদি ব্র্যান্ড এবং বৈশিষ্ট্যগুলির মধ্যে সম্পর্ক থাকে (যেমন এটি বৈধ কিনা বা না) তবে ম্যাকনেটসের সমাধানটিকে অগ্রাধিকার দেওয়া হবে (তবে অনুসন্ধানগুলি আরও ব্যয়বহুল / ধীর হবে)। অন্যদিকে, যদি এই সম্পর্কটি গুরুত্বপূর্ণ / আরও বেশি "অ্যাড-হক" না হয়, তবে কেউ আপনার সমাধানটিকে পছন্দ করতে পারে। আপনি যখন বলেছিলেন "আপনি পোস্টগ্র্রেএসকিউএল এর সাথে কখনই এটি ব্যবহার করব না" তখন আপনি কী বোঝাতে চেয়েছিলেন তার দ্বারা আপনি আরও কিছুটা ব্যাখ্যা করতে পারেন? " সেখানে এই মন্তব্যের কোনও ব্যাখ্যা বলে মনে হচ্ছে না। প্রশ্নগুলোর জন্য দুঃখিত!! আমি এখনও পর্যন্ত আপনার জবাবগুলির সত্যই প্রশংসা করছি :)
তরুণরাই

1
একটি সম্পর্ক স্পষ্টভাবে আছে, একমাত্র প্রশ্ন হ'ল এটি পরিচালনা করার জন্য আপনার কতটা দরকার। যদি আমি বৈশিষ্ট্য , বৈশিষ্ট্য বা এর মতো অস্পষ্ট শব্দটি ব্যবহার করি , তবে আমি সাধারণত বলতে চাইছি এটি বেশ বেশি অ্যাড-হক বা অত্যন্ত কাঠামোগত। তার জন্য, জেএসওএনবি আরও ভাল কারণ এটি সহজ। আপনি এই পোস্টটি তথ্যমূলক coussej.github.io/2016/01/14/…
ইভান ক্যারল

-1

একটি সহজ সমাধান হ'ল প্রধান জামাকাপড়ের টেবিলের কলাম হিসাবে সমস্ত সম্ভাব্য বৈশিষ্ট্য অন্তর্ভুক্ত করা এবং ব্র্যান্ডের নির্দিষ্ট সমস্ত কলামকেই নোলযোগ্য করে তোলা। এই সমাধানটি ডাটাবেস স্বাভাবিককরণকে ভঙ্গ করে তবে কার্যকর করা খুব সহজ।


আমি মনে করি .. আপনি কী বলছেন তা সম্পর্কে আমার ধারণা রয়েছে তবে এটি আরও বিশদ এবং সম্ভবত একটি উদাহরণ অন্তর্ভুক্ত করা সহায়ক হতে পারে।
যুবক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.