Diese Frage dreht sich darum, wie ich eine Datenbank entwerfen soll, es kann sich um relationale / nosql-Datenbanken handeln, je nachdem, welche die bessere Lösung sein wird
Unter der Voraussetzung, dass Sie ein System erstellen müssen, das eine Datenbank zur Verfolgung von "Unternehmen" und "Benutzer" umfasst. Ein einzelner Benutzer gehört immer nur einer Firma an
- Ein Benutzer kann nur einer Firma angehören
- Ein Unternehmen kann viele Benutzer haben
Das Design für den "Company" -Tisch ist recht unkompliziert. Firma wird die folgenden Attribute / Spalten haben: (Lassen Sie es uns einfach halten)
ID, COMPANY_NAME, CREATED_ON
Erstes Szenario
Einfach und unkompliziert, Benutzer haben alle das gleiche Attribut. Dies kann also einfach in relationaler Art und Weise durchgeführt werden. Benutzertabelle:
ID, COMPANY_ID, FIRST_NAME, LAST_NAME, EMAIL, CREATED_ON
Zweites Szenario
Was passiert, wenn verschiedene Unternehmen unterschiedliche Profilattribute für ihren Benutzer speichern möchten? Jedes Unternehmen verfügt über definierte Attribute, die für alle Benutzer dieses Unternehmens gelten.
Beispielsweise:
- Firma A möchte speichern: LIKE_MOVIE (boolean), LIKE_MUSIC (boolean)
- Firma B möchte speichern: FAV_CUISINE (String)
- Firma C möchte speichern: OWN_DOG (boolean), DOG_COUNT (int)
Ansatz 1
Die Brute-Force-Methode besteht darin, ein einziges Schema für den Benutzer zu haben und Nullen zuzulassen, wenn sie nicht zur Firma gehören:
ID, COMPANY_ID, FIRST_NAME, LAST_NAME, EMAIL, LIKE_MOVIE, LIKE_MUSIC, FAV_CUISINE, OWN_DOG, DOG_COUNT, CREATED_ON
Das ist ein bisschen böse, weil Sie am Ende viele NULL-Werte und Benutzerzeilen haben, deren Spalten für sie irrelevant sind (dh, alle Benutzer, die zu Unternehmen A gehören, haben NULL-Werte für FAV_CUISINE, OWN_DOG, DOG_COUNT).
Ansatz 2
Ein zweiter Ansatz ist, ein "Freiformfeld" zu haben:
ID, COMPANY_ID, FIRST_NAME, LAST_NAME, EMAIL, CUSTOM_1, CUSTOM_2, CUSTOM_3, CREATED_ON
Was für sich genommen unangenehm wäre, da Sie keine Ahnung haben, was benutzerdefinierte Felder sind, spiegelt der Datentyp nicht die gespeicherten Werte wider (z. B. speichern wir den Wert int als VARCHAR).
Ansatz 3
Ich habe mir das PostgreSQL-JSON-Feld angesehen. In diesem Fall haben Sie:
ID, COMPANY_ID, FIRST_NAME, LAST_NAME, EMAIL, CUSTOM_PROFILE_JSON, CREATED_ON
Wie können Sie in diesem Fall verschiedene Schemas auf einen Benutzer anwenden? Ein Benutzer mit Firma A hat ein Schema, das so aussieht
{"LIKE_MOVIE":"boolean", "LIKE_MUSIC": "boolean"}
Während ein Benutzer mit Firma C ein anderes Schema hat:
{"OWN_DOG ":"boolean", "DOG_COUNT": "int"}
Wie soll ich dieses Problem lösen? Wie kann ich die Datenbank richtig entwerfen, um dieses flexible Schema für ein einzelnes "Objekt" (Benutzer) basierend auf der Beziehung, die sie haben (Firma), zu ermöglichen?
relationale Lösung? nosql lösung?
Bearbeiten: Ich habe auch über eine "CUSTOM_PROFILE" -Tabelle nachgedacht, in der Benutzerattribute im Wesentlichen in Zeilen und nicht in Spalten gespeichert werden.
Bei diesem Ansatz gibt es zwei Probleme:
1) Die Datenmenge pro Benutzer wächst eher als Zeilen als als als Spalten. Dies bedeutet, dass für ein vollständiges Bild des Benutzers eine Vielzahl von Verknüpfungen durchgeführt werden muss und mehrere Verknüpfungen mit der Tabelle "Benutzerdefiniertes Profil" für die verschiedenen benutzerdefinierten Attribute erforderlich sind
2) Der Datenwert wird immer als VARCHAR gespeichert, um generisch zu sein, auch wenn wir wissen, dass die Daten ganzzahlig oder boolesch usw. Sein sollen