Câu hỏi này xoay quanh việc tôi nên thiết kế cơ sở dữ liệu như thế nào, nó có thể là cơ sở dữ liệu quan hệ / nosql, tùy thuộc vào điều gì sẽ là giải pháp tốt hơn
Đưa ra một yêu cầu trong đó bạn sẽ cần tạo một hệ thống sẽ liên quan đến cơ sở dữ liệu để theo dõi "Công ty" và "Người dùng". Một người dùng luôn chỉ thuộc về một công ty
- Một người dùng chỉ có thể thuộc về một công ty
- Một công ty có thể có nhiều người dùng
Thiết kế cho bảng "Công ty" khá đơn giản. Công ty sẽ có các thuộc tính / cột sau: (hãy giữ cho nó đơn giản)
ID, COMPANY_NAME, CREATED_ON
Kịch bản đầu tiên
Đơn giản và dễ hiểu, tất cả người dùng đều có cùng thuộc tính, vì vậy điều này có thể dễ dàng thực hiện theo kiểu quan hệ, bảng người dùng:
ID, COMPANY_ID, FIRST_NAME, LAST_NAME, EMAIL, CREATED_ON
Kịch bản thứ hai
Điều gì xảy ra nếu các công ty khác nhau muốn lưu trữ thuộc tính hồ sơ khác nhau cho người dùng của họ. Mỗi công ty sẽ có một bộ thuộc tính được xác định sẽ áp dụng cho tất cả người dùng của công ty đó.
Ví dụ:
- Công ty A muốn lưu trữ: THÍCH_MOVIE (boolean), THÍCH_MUSIC (boolean)
- Công ty B muốn lưu trữ: FAV_CUISINE (Chuỗi)
- Công ty C muốn lưu trữ: OWN_DOG (boolean), DOG_COUNT (int)
Cách tiếp cận 1
cách thức mạnh mẽ là có một lược đồ duy nhất cho người dùng và để họ có null khi họ không thuộc về công ty:
ID, COMPANY_ID, FIRST_NAME, LAST_NAME, EMAIL, LIKE_MOVIE, LIKE_MUSIC, FAV_CUISINE, OWN_DOG, DOG_COUNT, CREATED_ON
Điều này thật khó chịu vì bạn sẽ có rất nhiều NULLS và hàng người dùng có các cột không liên quan đến họ (ví dụ: tất cả người dùng thuộc Công ty A có các giá trị NULL cho FAV_CUISINE, OWN_DOG, DOG_COUNT)
Cách tiếp cận 2
cách tiếp cận thứ hai, là có "trường biểu mẫu miễn phí":
ID, COMPANY_ID, FIRST_NAME, LAST_NAME, EMAIL, CUSTOM_1, CUSTOM_2, CUSTOM_3, CREATED_ON
Điều này sẽ gây khó chịu cho chính bạn vì bạn không biết trường tùy chỉnh là gì, kiểu dữ liệu sẽ không phản ánh các giá trị được lưu trữ (ví dụ: chúng tôi sẽ lưu trữ giá trị int dưới dạng VARCHAR).
Cách tiếp cận 3
Tôi đã xem xét trường JSON của PostgreSQL, trong trường hợp đó bạn sẽ có:
ID, COMPANY_ID, FIRST_NAME, LAST_NAME, EMAIL, CUSTOM_PROFILE_JSON, CREATED_ON
Trong trường hợp này, làm thế nào bạn có thể áp dụng các lược đồ khác nhau cho người dùng? Người dùng với Công ty A sẽ có lược đồ giống như
{"LIKE_MOVIE":"boolean", "LIKE_MUSIC": "boolean"}
Trong khi người dùng với Công ty C sẽ có một lược đồ khác:
{"OWN_DOG ":"boolean", "DOG_COUNT": "int"}
Tôi nên giải quyết vấn đề này như thế nào? Làm cách nào tôi có thể thiết kế cơ sở dữ liệu đúng cách để cho phép lược đồ linh hoạt này cho một "đối tượng" (Người dùng) duy nhất dựa trên mối quan hệ họ có (Công ty)?
Giải pháp quan hệ? Giải pháp nosql?
Chỉnh sửa: Tôi cũng đã nghĩ về bảng "CUSTOM_PROFILE" về cơ bản sẽ lưu trữ các thuộc tính người dùng theo hàng thay vì cột.
Có 2 vấn đề với cách tiếp cận này:
1) Dữ liệu tăng theo mỗi người dùng tăng theo hàng thay vì cột - và điều này có nghĩa là để có được một bức tranh đầy đủ về người dùng, rất nhiều phép nối cần được thực hiện, nhiều lần tham gia vào bảng "hồ sơ tùy chỉnh" trên các thuộc tính tùy chỉnh khác nhau
2) Giá trị dữ liệu luôn được lưu trữ dưới dạng VARCHAR là chung, ngay cả khi chúng ta biết dữ liệu được coi là số nguyên hoặc boolean, v.v.