Це питання полягає в тому, як я повинен створити базу даних, це можуть бути реляційні / nosql бази даних, залежно від того, що буде кращим рішенням
З огляду на вимогу, де потрібно створити систему, яка буде включати базу даних для відстеження "Компанія" та "Користувач". Один користувач завжди належить лише одній компанії
- Користувач може належати лише одній компанії
- У компанії може бути багато користувачів
Дизайн столу «Компанія» досить простий. Компанія матиме такі атрибути / стовпці: (давайте нехай це буде просто)
ID, COMPANY_NAME, CREATED_ON
Перший сценарій
Прості та прямі, всі користувачі мають однаковий атрибут, тому це можна легко зробити у реляційному стилі, таблиця користувачів:
ID, COMPANY_ID, FIRST_NAME, LAST_NAME, EMAIL, CREATED_ON
Другий сценарій
Що станеться, якщо різні компанії хочуть зберігати різні атрибути профілю для свого користувача. Кожна компанія матиме визначений набір атрибутів, який би застосовувався до всіх користувачів цієї компанії.
Наприклад:
- Компанія A хоче зберігати: LIKE_MOVIE (булева), LIKE_MUSIC (булева)
- Компанія B хоче зберігати: FAV_CUISINE (String)
- Компанія C хоче зберігати: OWN_DOG (булева), DOG_COUNT (int)
Підхід 1
найсуворішим способом є створення єдиної схеми для користувача та нехай вони мають нулі, коли вони не належать компанії:
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
Я переглянув поле JSON PostgreSQL, і в цьому випадку у вас буде:
ID, COMPANY_ID, FIRST_NAME, LAST_NAME, EMAIL, CUSTOM_PROFILE_JSON, CREATED_ON
Як у цьому випадку ви могли б застосувати різні схеми до користувача? Користувач з компанією A матиме подібну схему
{"LIKE_MOVIE":"boolean", "LIKE_MUSIC": "boolean"}
Хоча користувач із компанією C матиме іншу схему:
{"OWN_DOG ":"boolean", "DOG_COUNT": "int"}
Як я повинен вирішити це питання? Як я можу правильно розробити базу даних, щоб дозволити цю гнучку схему для одного "об'єкта" (Користувача) на основі відносин, які вони мають (Компанія)?
реляційне рішення? nosql розчин?
Редагувати: Я також думав про таблицю "CUSTOM_PROFILE", яка по суті буде зберігати атрибути користувача в рядках, а не в стовпцях.
З цим підходом є дві проблеми:
1) Дані зростають на кожного користувача, зростаючи як рядки, а не стовпці - і це означає, щоб отримати повну картину користувача, потрібно зробити багато приєднань, кілька приєднань до таблиці "спеціальний профіль" на різних спеціальних атрибутах
2) Значення даних завжди зберігається як VARCHAR, щоб бути загальним, навіть якщо ми знаємо, що дані повинні бути цілими чи булевими тощо.