คำถามนี้เกี่ยวกับวิธีที่ฉันควรออกแบบฐานข้อมูลมันอาจเป็นฐานข้อมูลเชิงสัมพันธ์ / nosql ขึ้นอยู่กับสิ่งที่จะเป็นทางออกที่ดีกว่า
กำหนดข้อกำหนดที่คุณจะต้องสร้างระบบที่จะเกี่ยวข้องกับฐานข้อมูลเพื่อติดตาม "บริษัท " และ "ผู้ใช้" ผู้ใช้คนเดียวเป็นของ บริษัท เดียวเสมอ
- ผู้ใช้สามารถเป็นของ บริษัท เดียวเท่านั้น
- บริษัท สามารถมีผู้ใช้หลายคน
การออกแบบสำหรับตาราง "บริษัท " ค่อนข้างตรงไปตรงมา บริษัท จะมีคุณสมบัติ / คอลัมน์ต่อไปนี้: (ขอให้ง่าย)
ID, COMPANY_NAME, CREATED_ON
สถานการณ์แรก
เรียบง่ายและตรงไปตรงมาผู้ใช้ทุกคนมีคุณลักษณะเดียวกันดังนั้นสิ่งนี้สามารถทำได้อย่างง่ายดายในลักษณะสัมพันธ์ตารางผู้ใช้:
ID, COMPANY_ID, FIRST_NAME, LAST_NAME, EMAIL, CREATED_ON
สถานการณ์ที่สอง
จะเกิดอะไรขึ้นหาก บริษัท ต่าง ๆ ต้องการจัดเก็บแอตทริบิวต์โปรไฟล์ที่แตกต่างกันสำหรับผู้ใช้ แต่ละ บริษัท จะมีชุดแอตทริบิวต์ที่กำหนดไว้ซึ่งจะใช้กับผู้ใช้ทั้งหมดของ บริษัท นั้น
ตัวอย่างเช่น:
- บริษัท A ต้องการเก็บ: LIKE_MOVIE (บูลีน), LIKE_MUSIC (บูลีน)
- บริษัท B ต้องการเก็บ: FAV_CUISINE (สตริง)
- บริษัท C ต้องการเก็บ: OWN_DOG (บูลีน), DOG_COUNT (int)
วิธีที่ 1
วิธีเดรัจฉานบังคับคือการมี schema เดียวสำหรับผู้ใช้และให้พวกเขามีโมฆะเมื่อพวกเขาไม่ได้เป็นของ บริษัท :
ID, COMPANY_ID, FIRST_NAME, LAST_NAME, EMAIL, LIKE_MOVIE, LIKE_MUSIC, FAV_CUISINE, OWN_DOG, DOG_COUNT, CREATED_ON
ซึ่งน่ารังเกียจเพราะคุณจะจบลงด้วยจำนวน NULLS และแถวผู้ใช้ที่มีคอลัมน์ที่ไม่เกี่ยวข้อง (เช่นผู้ใช้ทั้งหมดที่เป็นของ บริษัท A มีค่า NULL สำหรับ FAV_CUISINE, OWN_DOG, DOG_COUNT)
วิธีที่ 2
วิธีที่สองคือต้องมี "เขตข้อมูลอิสระ":
ID, COMPANY_ID, FIRST_NAME, LAST_NAME, EMAIL, CUSTOM_1, CUSTOM_2, CUSTOM_3, CREATED_ON
ซึ่งน่ารังเกียจด้วยตัวเองเนื่องจากคุณไม่ทราบว่าฟิลด์ที่กำหนดเองคืออะไรประเภทข้อมูลจะไม่สะท้อนค่าที่จัดเก็บ (เช่นเราจะเก็บค่า int เป็น VARCHAR)
วิธีที่ 3
ฉันได้ดูในฟิลด์ PostgreSQL JSON ซึ่งในกรณีนี้คุณจะมี:
ID, COMPANY_ID, FIRST_NAME, LAST_NAME, EMAIL, CUSTOM_PROFILE_JSON, CREATED_ON
ในกรณีนี้คุณจะสามารถใช้สคีมาที่แตกต่างกับผู้ใช้ได้อย่างไร ผู้ใช้ที่มี Company A จะมีสคีมาที่ดูเหมือน
{"LIKE_MOVIE":"boolean", "LIKE_MUSIC": "boolean"}
ในขณะที่ผู้ใช้ที่มี Company C จะมีสคีมาต่างกัน:
{"OWN_DOG ":"boolean", "DOG_COUNT": "int"}
ฉันจะแก้ไขปัญหานี้ได้อย่างไร ฉันจะออกแบบฐานข้อมูลอย่างถูกต้องเพื่อให้สคีมาที่ยืดหยุ่นนี้สำหรับ "วัตถุ" เดียว (ผู้ใช้) ตามความสัมพันธ์ที่มี (บริษัท ) ได้อย่างไร
วิธีการแก้ปัญหาเชิงสัมพันธ์? วิธีการแก้ปัญหา nosql?
แก้ไข:ฉันยังคิดถึงตาราง "CUSTOM_PROFILE" ซึ่งจะเก็บแอตทริบิวต์ของผู้ใช้ในแถวแทนที่จะเป็นคอลัมน์
มี 2 ปัญหาเกี่ยวกับวิธีการนี้:
1) ข้อมูลเติบโตต่อผู้ใช้ที่เติบโตเป็นแถวแทนที่จะเป็นคอลัมน์ - และนี่หมายถึงการได้รับภาพเต็มของผู้ใช้จำเป็นต้องทำการรวมจำนวนมากเข้าร่วมหลายตารางกับ "โปรไฟล์ที่กำหนดเอง" ในแอตทริบิวต์ที่กำหนดเองที่แตกต่างกัน
2) ค่าข้อมูลจะถูกเก็บเป็น VARCHAR ให้เป็นค่าทั่วไปเสมอแม้ว่าเราจะทราบว่าข้อมูลนั้นควรเป็นจำนวนเต็มหรือบูลีนเป็นต้น