8 Stimmen

Datenbank-Design: Benutzerprofile wie bei Meetup.com

Wenn Du auf Meetup.com einer Meetup-Gruppe beitrittst, musst Du in der Regel ein Profil für die jeweilige Gruppe ausfüllen. Wenn Sie beispielsweise einer Meetup-Gruppe für Filme beitreten, müssen Sie möglicherweise die Filmgenres angeben, die Sie mögen, usw.

Ich baue eine ähnliche Anwendung auf, bei der Benutzer verschiedenen Gruppen beitreten und unterschiedliche Profildetails für jede Gruppe ausfüllen können. Nehmen Sie die 2 Möglichkeiten an:

  1. Benutzer können ihre eigenen Gruppen erstellen und festlegen, welche Details sie den Benutzern, die dieser Gruppe beitreten, mitteilen möchten (also etwas, das ein wenig dynamisch ist - was vielleicht darauf hindeutet, dass zumindest ein EAV-Design erforderlich ist)
  2. Der Entwickler entscheidet nun, welche Gruppen erstellt werden sollen, und legt fest, welche Angaben die Nutzer, die dieser Gruppe beitreten, erhalten sollen (d. h. die Profildaten werden vordefiniert und im System "fest einprogrammiert").

Wie lassen sich solche Daten am besten modellieren?

Ein ausführlicheres Beispiel:

Die Gruppe "Kinogänger" bittet ihre Mitglieder, Folgendes anzugeben:

  • Name
  • Geburtsdatum (wird zur Berechnung des Alters des Mitglieds verwendet)
  • Geschlecht (bitte wählen Sie zwischen "männlich" und "weiblich")
  • Bevorzugte Genres (wählen Sie 1 oder mehrere aus einer Liste bestimmter Genres aus)

Die Gruppe "Extremsportarten" fordert ihre Mitglieder auf, Folgendes anzugeben:

  • Name
  • Beschreibung der genossenen Aktivitäten (in Form einer Erzählung)
  • Postleitzahl

Unterm Strich kann jede Gruppe unterschiedliche Angaben von den Mitgliedern verlangen, die ihrer Gruppe beitreten. Im Idealfall möchte ich, dass jeder eine Gruppe erstellen kann (ala MeetUp.com). Ich muss aber auch die Möglichkeit haben, die Mitglieder ziemlich gut zu suchen (z. B. alle weiblichen Kinobesucher zwischen 25 und 30 Jahren).

8voto

jedd.ahyoung Punkte 7822

Für so etwas wie .... würden Sie eine maximale Normalisierung wünschen, damit Sie nirgendwo doppelte Daten haben. Da Ihre benutzerdefinierten Tabellen möglicherweise die gleiche Art von Datensätzen enthalten könnten, denke ich, dass Sie über 3NF für diese.

Mein Vorschlag wäre folgender: Explodieren Sie Ihre Tabellen, so dass Sie etwas haben, das der 6NF mit der EAV, so dass für jede Frage, die die Benutzer beantworten müssen, eine eigene Tabelle erstellt wird. Die von den Benutzern erstellten Tabellen verweisen dann alle auf eine Ihrer Fragetabellen. Dies vermeidet das du

T

N

T W

I

1voto

ravnur Punkte 2734

F

Es gibt die

  • u
  • g
  • t
  • r

"

**User**
user_id
user_name

**Group**
name
group_id

user_group
user_id (FK)
group_id (FK)

**requirement**:
requirement_id
requirement_name
requirement_type (FK) (means the type: combo, free string, date) - should refers to dictionary)

**template**
template_id
template_name

**template_requirement**
r_id (FK)
t_id (FK)

T

**restrictions**
group_id
template_id
requirement_id (should be here as template_id because the same requirement can exists in different templates and any group can consists of many templates)
restriction_type (FK) (points to another dict: value, length, regexp, at_least_one_value_choosed and so on)

S

H

0voto

RaphaelH Punkte 2064

Sie können solche Daten als JSON oder XML (Struktur, Daten) speichern.

Benutzer-Tabelle

  • Benutzerkennung
  • Benutzername
  • Passwort
  • Gruppen -> JSON-Array mit allen Gruppen

GruppeStruktur Tabelle

  • Gruppennummer
  • Gruppenname
  • Gruppenstruktur -> JSON-Struktur (mit angegebenen Feldern)

GruppeDaten Tabelle

  • Benutzerkennung
  • Gruppennummer
  • Gruppendaten -> JSON-Daten

0voto

Ben English Punkte 3860

Ich denke, damit sind die meisten Ihrer Einschränkungen abgedeckt:

users
user\_id, user\_name, password, birth\_date, gender

1, Robert Jones, \*\*\*\*\*, 2011-11-11, M

group
group\_id, group\_name

1, Movie Goers
2, Extreme Sports

group\_membership
user\_id, group\_id
1, 1
1, 2

group\_data
group\_data\_id, group\_id, group\_data\_name

1, 1, Favorite Genres
2, 2, Favorite Activities

group\_data\_value
id, group\_data\_id, group\_data\_value
1,1,Comedy
2,1,Sci-Fi
3,1,Documentaries
4,2,Extreme Cage Fighting
5,2,Naked Extreme Bike Riding

user\_group\_data
user\_id, group\_id, group\_data\_id, group\_data\_value\_id

1,1,1,1
1,1,1,2
1,2,2,4
1,2,2,5

0voto

CStroliaDavis Punkte 382

Ich hatte ähnliche Probleme wie dieses. Ich bin mir nicht sicher, ob dies die beste Empfehlung für Ihre spezielle Situation ist, aber überlegen Sie es sich.

  1. Bieten Sie die Möglichkeit, Daten als XML, JSON oder in einem anderen Format zu speichern, das die Daten abgrenzt, sie aber im Grunde in einem Feld speichert, das kein bestimmtes Format hat.

  2. Bereitstellung einer Möglichkeit zur Speicherung der Definition dieser Daten

  3. Stellen Sie eine Nachschlage-/Index-Tabelle für die Daten bereit.

Dabei handelt es sich um eine Kombination der bereits genannten Techniken.

Im Wesentlichen würden Sie eine Schnittstelle für Ihre Kunden schaffen, damit diese ein "Formular" für die zu speichernden Daten erstellen können. Dieses Formular würde angeben, welche Informationen sie vom Benutzer haben wollen. Es würde auch angeben, nach welchen Informationen Sie suchen möchten.

Speichern Sie diese Informationen in der Definitionstabelle.

Die Definitionstabelle wird dann verwendet, um die Benutzeroberfläche für die Dateneingabe zu beschreiben.

Sobald die Benutzerdaten eingegeben sind, speichern Sie die Daten (als xml oder was auch immer) in einer Tabelle mit einer eindeutigen ID. Gleichzeitig wird eine andere Tabelle als Index mit

id, wo die XML-Daten gespeichert wurden Name des Feldes, in dem die Daten gespeichert sind Wert des Feldes, in dem die Daten gespeichert sind. id der Datendefinition.

Wenn nun eine Suche beginnt, sollte es kein Problem sein, die Informationen in der Indextabelle nach Name, Wert und Definitions-ID zu suchen und die ID der xml/json-Daten (oder was auch immer) zurückzubekommen, die Sie in der Tabelle gespeichert haben, in der das Datenformular gespeichert wurde.

Diese Daten sollten umwandelbar sein, sobald sie abgerufen wurden.

Ich habe mich nicht genau ausgedrückt, aber ich hoffe, dass diese Antwort ausreicht, um Ihnen den Einstieg zu erleichtern. Wenn Sie eine Erklärung oder zusätzliche Details wünschen, lassen Sie es mich wissen und ich werde Ihnen gerne helfen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X