ใช่มันเป็นความคิดที่แย่มาก
แทนที่จะไป:
SELECT Deal.Name, DealCategory.Name
FROM Deal
INNER JOIN
DealCategories ON Deal.DealID = DealCategories.DealID
INNER JOIN
DealCategory ON DealCategories.DealCategoryID = DealCategory.DealCategoryID
WHERE Deal.DealID = 1234
ตอนนี้คุณต้องไป:
SELECT Deal.ID, Deal.Name, DealCategories
FROM Deal
WHERE Deal.DealID = 1234
จากนั้นคุณต้องทำสิ่งต่าง ๆ ในรหัสแอปพลิเคชันของคุณเพื่อแยกรายการจุลภาคนั้นออกเป็นตัวเลขแต่ละตัวแล้วค้นหาฐานข้อมูลแยกจากกัน:
SELECT DealCategory.Name
FROM DealCategory
WHERE DealCategory.DealCategoryID IN (<<that list from before>>)
antipattern การออกแบบนี้เกิดจากความเข้าใจผิดที่สมบูรณ์ของการสร้างแบบจำลองเชิงสัมพันธ์ (คุณไม่ต้องกลัวตาราง Tables เป็นเพื่อนของคุณใช้พวกมัน) หรือความเชื่อที่เข้าใจผิดอย่างผิดปกติมันเร็วกว่าที่จะแยกรายการด้วยเครื่องหมายจุลภาค ในรหัสแอปพลิเคชันมากกว่าที่จะเพิ่มตารางลิงค์ ( ไม่เคยเป็น) ตัวเลือกที่สามคือพวกเขาไม่มั่นใจ / มีความสามารถเพียงพอกับ SQL ในการตั้งค่าคีย์ต่างประเทศ แต่ถ้าเป็นเช่นนั้นพวกเขาไม่ควรทำอะไรกับการออกแบบโมเดลเชิงสัมพันธ์
SQL Antipatterns (Karwin, 2010) อุทิศทั้งบทให้กับ antipattern นี้ (ซึ่งเขาเรียกว่า 'Jaywalking') หน้า 15-23 นอกจากนี้ผู้เขียนได้โพสต์ในคำถามที่คล้ายกันมากกว่าที่ SO ประเด็นสำคัญที่เขาบันทึกไว้ (ตามที่ใช้กับตัวอย่างนี้) คือ:
- การสืบค้นข้อตกลงทั้งหมดในหมวดหมู่ที่เฉพาะเจาะจงนั้นค่อนข้างซับซ้อน (วิธีที่ง่ายที่สุดในการแก้ปัญหานั้นคือนิพจน์ทั่วไป แต่นิพจน์ทั่วไปเป็นปัญหาในตัวของมันเอง)
- คุณไม่สามารถบังคับใช้ Referential Integrity ได้หากไม่มีความสัมพันธ์กับ Foreign Key หากคุณลบ DealCategory nr # 26 ในรหัสแอปพลิเคชันของคุณคุณต้องทำตามข้อตกลงแต่ละข้อเพื่อค้นหาการอ้างอิงถึงหมวดหมู่ # 26 และลบออก นี่คือสิ่งที่ควรจัดการที่ชั้นข้อมูลและการจัดการกับมันในแอปพลิเคชันของคุณเป็นสิ่งที่เลวร้ายมากเป็นสิ่งที่เลวร้ายมาก
- คำสั่งรวม (
COUNT
, SUM
ฯลฯ ) อีกครั้งแตกต่างจาก 'ซับซ้อน' ถึง 'ไปไม่ได้เกือบ' ถามนักพัฒนาของคุณว่าพวกเขาจะทำให้คุณได้รับรายชื่อหมวดหมู่ทั้งหมดที่มีจำนวนข้อเสนอในหมวดหมู่นั้น ๆ อย่างไร ด้วยการออกแบบที่เหมาะสมนั่นคือ SQL สี่บรรทัด
- การอัปเดตกลายเป็นเรื่องยากมากขึ้น (เช่นคุณมีดีลอยู่ในห้าหมวดหมู่ แต่คุณต้องการลบสองรายการและเพิ่มอีกสามหมวดหมู่) นั่นคือ SQL สามบรรทัดที่มีการออกแบบที่เหมาะสม
- ในที่สุดคุณจะพบ
VARCHAR
ข้อจำกัดความยาวของรายการ แม้ว่าคุณจะมีรายการที่คั่นด้วยเครื่องหมายจุลภาคที่มีมากกว่า 4,000 ตัวอักษร แต่โอกาสในการแยกมอนสเตอร์นั้นก็จะช้าเหมือนนรกอยู่ดี
- การดึงรายการออกจากฐานข้อมูลแยกออกแล้วกลับไปที่ฐานข้อมูลสำหรับแบบสอบถามอื่นช้ากว่าภายในหนึ่งแบบสอบถาม
TLDR: มันเป็นข้อบกพร่องพื้นฐานการออกแบบมันไม่ได้ปรับขนาดได้ดีมันนำเสนอความซับซ้อนเพิ่มเติมแม้กระทั่งการสืบค้นที่ง่ายที่สุด