การออกแบบฐานข้อมูลด้วยผลิตภัณฑ์หลายประเภท? [ปิด]

ในส่วนหนึ่งของโครงการล่าสุดที่ฉันเริ่มวางแผน ฉันจำเป็นต้องสร้างโครงสร้างของฐานข้อมูลที่จะประกอบด้วยผลิตภัณฑ์หลายอย่าง ตัวอย่างเช่น ลองนึกถึงวิธีจัดโครงสร้างของ Amazon มีหลายประเภทและภายในหมวดหมู่เหล่านั้นมีหมวดหมู่ย่อยหลายหมวด

ปัญหาของฉันคือตามแนวคิดแล้ว ฉันไม่แน่ใจเกี่ยวกับวิธีการสร้างตารางฐานข้อมูล ฉันเคยคิดที่จะสร้างตารางอ้างอิงตัวเองสำหรับหมวดหมู่และหมวดหมู่ย่อย แต่เนื่องจากฉันวางแผนที่จะมีผลิตภัณฑ์ที่หลากหลายในฐานข้อมูล ฉันไม่รู้ว่าควรจัดกลุ่มให้เป็นตารางเดียวที่เรียกว่า " ผลิตภัณฑ์" หรือวางทั้งหมดไว้ในตารางแยกกัน

ตัวอย่างเช่น ห้องน้ำอาจเป็นผลิตภัณฑ์ชิ้นหนึ่ง ในขณะที่โทรทัศน์อาจเป็นอีกผลิตภัณฑ์หนึ่ง แม้ว่าจะมีหมวดหมู่/หมวดหมู่ย่อยที่แตกต่างกัน แต่ก็เป็นผลิตภัณฑ์ทั้งสอง เมื่อวางไว้ในตาราง "ผลิตภัณฑ์" เดียว พวกเขาจะแชร์แอตทริบิวต์ที่ไม่สมเหตุสมผลสำหรับทั้งคู่ ห้องน้ำไม่จำเป็นต้องมีแอตทริบิวต์สำหรับความละเอียดหรือขนาดการแสดงผล (เว้นแต่จะเป็นห้องน้ำที่พิเศษมาก) และโทรทัศน์ก็ไม่จำเป็นต้องมีแอตทริบิวต์ขนาดที่นั่ง

ฉันคิดว่าวิธีหนึ่งที่จะหลีกเลี่ยงสิ่งนี้และยังคงเก็บทุกอย่างไว้ในตารางเดียวคือการสร้างแอตทริบิวต์ NOT NULL จำนวนมากที่อาจขาดหายไปสำหรับบางรายการหากไม่จำเป็น แต่สามัญสำนึกกำลังบอกฉันว่านี่อาจจะไม่ วิธีที่ดีที่สุดในการทำสิ่งต่างๆ

ณ จุดนี้ ฉันรู้สึกว่าปัญหาที่แท้จริงของฉันคือการหาวิธีจัดโครงสร้างฐานข้อมูลและตารางด้วยหมวดหมู่/หมวดหมู่ย่อยหลายประเภท และรายการประเภทต่างๆ ฉันจะสร้างโต๊ะสำหรับโทรทัศน์และโต๊ะสำหรับห้องน้ำหรือไม่? ทั้งหมดนี้จะมีโครงสร้างอย่างไร? โดยปกติแล้วปัญหาประเภทนี้มีการวางแผนไว้อย่างไร?

ขอบคุณ


person biddano    schedule 27.12.2013    source แหล่งที่มา


คำตอบ (3)


นี่เป็นการตัดสินใจออกแบบมากกว่าสิ่งอื่นใด

ฉันจะแยกตารางดังนี้:

categories (เช่น ครัวเรือน)

sub_categories (เช่น ห้องน้ำเป็นกุญแจต่างประเทศของครัวเรือน)

products (เช่น โถสุขภัณฑ์เซรามิก)

สำหรับแอตทริบิวต์เพิ่มเติม คุณสามารถจัดเก็บสิ่งเหล่านี้ได้โดยตรงภายในตารางผลิตภัณฑ์หรือสร้างตารางอื่นที่เรียกว่า products_extra_attributes และเก็บค่า NULL ที่เป็นตัวเลือกไว้ภายในตาราง products ซึ่งจะเป็นคีย์นอกที่ชี้ไปยังคุณลักษณะเพิ่มเติมสำหรับแต่ละผลิตภัณฑ์

ทำให้รู้สึก? ฉันจะทำการแก้ไขในภายหลังหากไม่ใช่เนื่องจากฉันกำลังตอบคำถามนี้จากโทรศัพท์

person Joel Murphy    schedule 27.12.2013
comment
โอเค ฉันคิดว่านี่สมเหตุสมผลแล้ว ดังนั้น ฉันจะมีแอตทริบิวต์ทั่วไปสำหรับผลิตภัณฑ์ทั้งหมดในตารางผลิตภัณฑ์และมีคีย์นอกสำหรับตาราง ExtraAttributes อื่น (ชื่ออะไรทำนองนั้น) โดยที่แต่ละแถวใน ExtraAttributes จะมีคุณสมบัติสำหรับผลิตภัณฑ์ที่แตกต่างกัน เช่น ห้องน้ำหรือโทรทัศน์ นั่นฟังดูใช่มั้ย? - person biddano; 27.12.2013
comment
คุณได้รับมัน :) ขึ้นอยู่กับขนาดของแคตตาล็อกผลิตภัณฑ์ของคุณ - คุณควรทำสิ่งต่าง ๆ ด้วยวิธีนี้ดีกว่าเพราะคุณจะเข้าร่วมตารางก็ต่อเมื่อผลิตภัณฑ์มีคุณสมบัติเพิ่มเติม (พิจารณาจากค่าคีย์ต่างประเทศเพิ่มเติมภายในตารางผลิตภัณฑ์ ตามที่คุณคิด) - person Joel Murphy; 27.12.2013

ตารางผลิตภัณฑ์ทั่วไปเป็นแนวทางที่ดี คุณจะไม่ต้องการสร้างตารางใหม่ในสคีมาของคุณทุกครั้งที่คุณมีผลิตภัณฑ์ประเภทใหม่

เช่นเดียวกับประเภทต่างๆ ตารางการอ้างอิงตนเองจะดีกว่าหากมีความสัมพันธ์ระหว่างพ่อแม่/ลูก ดังนั้นคุณจึงไม่จำเป็นต้องสร้างตารางใหม่ทุกครั้งที่คุณต้องการระดับหมวดหมู่ย่อยใหม่

ตารางผลิตภัณฑ์ของคุณควรมีข้อมูลทั่วไปในบรรดาผลิตภัณฑ์ทั้งหมดของคุณ เช่น. ชื่อและราคาที่เป็นไปได้ (แม้ว่าคุณจะมีราคาที่แตกต่างกันสำหรับผลิตภัณฑ์แต่ละรายการ ราคาจะถูกเก็บไว้ในตารางอื่นที่อ้างอิงถึงผลิตภัณฑ์)

หากคุณมีข้อมูลอื่นๆ มากมายที่เกี่ยวข้องกับคุณลักษณะของผลิตภัณฑ์แต่ละรายการ อาจสร้างตารางแอตทริบิวต์และตารางอื่นที่อ้างอิงค่าของคุณลักษณะแต่ละรายการของผลิตภัณฑ์นั้น

นี่เป็นตัวอย่างสคีมาง่ายๆ:

ป้อนคำอธิบายรูปภาพที่นี่

person antony    schedule 27.12.2013
comment
ดี. เพียงสังเกตบนแผนภาพของคุณ ทำไมไม่ละทิ้งตารางหมวดหมู่และเพิ่มคุณสมบัติ (id, parent_id, name) ลงในตาราง category_product - person fat_mike; 27.07.2017
comment
@fat_mike สคีมาข้างต้นทำงานได้ดีเมื่อคุณมีผลิตภัณฑ์ที่มีอยู่ในหลายหมวดหมู่ นอกจากนี้ยังหลีกเลี่ยงข้อมูลที่ซ้ำกัน เช่น ชื่อหมวดหมู่ แต่ละครั้งที่คุณเพิ่มผลิตภัณฑ์ลงในหมวดหมู่ (เนื่องจากแต่ละระเบียนจะต้องมีคุณสมบัติชื่อหมวดหมู่) - person antony; 31.07.2017

ขึ้นอยู่กับจำนวนสินค้า หากคุณขายเฉพาะห้องน้ำและโทรทัศน์ ฉันจะบอกว่าทำตารางแยกกันโดยสิ้นเชิงสำหรับพวกเขา แต่ถ้าคุณมีประเภทผลิตภัณฑ์ที่แตกต่างกัน 100 รายการซึ่งทั้งหมดจะมีคุณลักษณะที่แตกต่างกัน ฉันอาจแนะนำให้สร้างตารางผลิตภัณฑ์ที่จัดเก็บคุณลักษณะทั่วไป (ซึ่ง ทั้งหมดมีค่าใช้จ่ายและอาจเป็นขนาด) จากนั้นตารางประเภทผลิตภัณฑ์ที่ระบุชุดคุณลักษณะสำหรับผลิตภัณฑ์แต่ละประเภท จากนั้นตารางคุณลักษณะเพื่อกำหนดคุณลักษณะและ lat ตารางมูลค่าผลิตภัณฑ์

เช่น ยกตัวอย่างทีวีโซนี่ จะอยู่ในสินค้าที่มีราคาและลิงค์ไปยังประเภทสินค้าซึ่งก็คือทีวี นั่นอาจเป็นการเข้าร่วมคุณลักษณะที่ทีวีทุกเครื่องมีและทีวี Sony ก็จะมีรายการในมูลค่าผลิตภัณฑ์สำหรับแต่ละคุณลักษณะเหล่านั้น ด้วยวิธีนี้ คุณจะไม่ต้องกำหนดแอตทริบิวต์ที่ใช้ร่วมกันใหม่ ดังนั้นเมื่อคุณเริ่มขายสิ่งอื่นๆ ที่มีการแก้ปัญหา คุณสามารถเพิ่มสิ่งเหล่านั้นลงในประเภทผลิตภัณฑ์ได้

ทำให้รู้สึก?

person Frank Conry    schedule 27.12.2013