To pytanie dotyczy tego, jak powinienem zaprojektować bazę danych, mogą to być relacyjne / nosql bazy danych, w zależności od tego, co będzie lepszym rozwiązaniem
Biorąc pod uwagę wymóg, w którym będziesz musiał stworzyć system, który będzie obejmował bazę danych do śledzenia „Firmy” i „Użytkownika”. Jeden użytkownik zawsze należy tylko do jednej firmy
- Użytkownik może należeć tylko do jednej firmy
- Firma może mieć wielu użytkowników
Konstrukcja stołu „Firma” jest dość prosta. Firma będzie miała następujące atrybuty / kolumny: (bądźmy prostsze)
ID, COMPANY_NAME, CREATED_ON
Pierwszy scenariusz
Prosty i bezpośredni, wszyscy użytkownicy mają ten sam atrybut, więc można to łatwo zrobić w stylu relacyjnym, tabela użytkowników:
ID, COMPANY_ID, FIRST_NAME, LAST_NAME, EMAIL, CREATED_ON
Drugi scenariusz
Co się stanie, jeśli różne firmy chcą przechowywać różne atrybuty profilu dla swojego użytkownika. Każda firma będzie miała zdefiniowany zestaw atrybutów, które miałyby zastosowanie do wszystkich użytkowników tej firmy.
Na przykład:
- Firma A chce przechowywać: LIKE_MOVIE (boolean), LIKE_MUSIC (boolean)
- Firma B chce przechowywać: FAV_CUISINE (ciąg)
- Firma C chce przechowywać: OWN_DOG (boolean), DOG_COUNT (int)
Podejście 1
brutalną siłą jest posiadanie jednego schematu dla użytkownika i pozwalanie mu mieć wartości zerowe, gdy nie należą do firmy:
ID, COMPANY_ID, FIRST_NAME, LAST_NAME, EMAIL, LIKE_MOVIE, LIKE_MUSIC, FAV_CUISINE, OWN_DOG, DOG_COUNT, CREATED_ON
Co jest dość nieprzyjemne, ponieważ skończysz z dużą liczbą NULLS i wierszy użytkowników, które mają dla nich kolumny, które nie są dla nich istotne (tj. Wszyscy użytkownicy należący do Firmy A mają wartości NULL dla FAV_CUISINE, OWN_DOG, DOG_COUNT)
Podejście 2
drugim podejściem jest posiadanie „pola swobodnego”:
ID, COMPANY_ID, FIRST_NAME, LAST_NAME, EMAIL, CUSTOM_1, CUSTOM_2, CUSTOM_3, CREATED_ON
Co samo w sobie byłoby paskudne, ponieważ nie masz pojęcia, jakie są pola niestandardowe, typ danych nie będzie odzwierciedlał przechowywanych wartości (np. Zapiszemy wartość int jako VARCHAR).
Podejście 3
Zajrzałem do pola JSON PostgreSQL, w którym to przypadku będziesz mieć:
ID, COMPANY_ID, FIRST_NAME, LAST_NAME, EMAIL, CUSTOM_PROFILE_JSON, CREATED_ON
W takim przypadku, w jaki sposób można zastosować różne schematy dla użytkownika? Użytkownik z firmą A będzie miał schemat, który wygląda
{"LIKE_MOVIE":"boolean", "LIKE_MUSIC": "boolean"}
Podczas gdy użytkownik z firmą C będzie miał inny schemat:
{"OWN_DOG ":"boolean", "DOG_COUNT": "int"}
Jak mam rozwiązać ten problem? Jak właściwie zaprojektować bazę danych, aby umożliwić stosowanie tego elastycznego schematu dla pojedynczego „obiektu” (użytkownika) na podstawie relacji, którą mają (firma)?
rozwiązanie relacyjne? rozwiązanie nosql?
Edycja: Pomyślałem także o tabeli „CUSTOM_PROFILE”, która zasadniczo przechowuje atrybuty użytkownika w wierszach, a nie w kolumnach.
Z tym podejściem wiążą się 2 problemy:
1) Dane rosną w przeliczeniu na użytkownika, rosną jako wiersze, a nie kolumny - a to oznacza, aby uzyskać pełny obraz użytkownika, trzeba wykonać wiele połączeń, wiele połączeń do tabeli „profil niestandardowy” na różnych atrybutach niestandardowych
2) Wartość danych jest zawsze przechowywana jako VARCHAR, aby była generyczna, nawet jeśli wiemy, że dane powinny być liczbami całkowitymi lub logicznymi itp.