4 Stimmen

SQL-Tabelle "Mitglieder" zur Darstellung der Familienbeziehungen zwischen den Mitgliedern

Ich versuche schon seit Tagen, diese Datenbank zu entwerfen. Ich entwerfe sie in Access und implementiere sie dann auf dem MYSQL-Server als PHP-Webanwendung.

Ich habe einen Tisch:

Mitglieder

  • MitgliedID (autoNummer, PK)
  • Mitgliedsname
  • MitgliedDetails

Mitglieder können viele Beziehungen zu anderen Mitgliedern haben, z. B. zu Kindern, Eltern, Freunden, Ehepartnern usw. Wenn ich mir ein Mitglied ansehe, möchte ich neue Beziehungen zu bestehenden Mitgliedern anlegen können und diese Beziehung dann auch ohne weitere Eingaben für das betreffende Mitglied sichtbar machen können. Die Mitglieder sollten auch in der Lage sein, alle ihre Beziehungen aufzulisten.

Können Sie mir bitte sagen, wie ich das machen soll? Ich habe einige Optionen ausprobiert, aber keine scheint wie vorgesehen zu funktionieren. Ich kenne mich mit SQL aus, aber ich habe Probleme mit dem Design der unären Beziehung.

-edit- Ich habe auch vergessen, hinzuzufügen, dass ich aufgrund von Serverbeschränkungen keine INNODB verwenden kann. Höchstwahrscheinlich wird MYISAM sein, obwohl ich immer noch referenzielle Integrität will :(

5voto

Minras Punkte 3866

Lassen Sie den Tisch members enthalten Mitgliederdaten und die Tabelle relations enthalten Daten zu den Mitgliederbeziehungen. relations.member_id wird ein Verweis auf das Mitglied sein, relations.related_member_id - an das entsprechende Mitglied. relations.type ist ein aufzählbarer Beziehungstyp.

CREATE TABLE `members` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`name` TEXT NOT NULL ,
`details` TEXT NOT NULL
) ENGINE = INNODB;

CREATE TABLE `relations` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`member_id` INT NOT NULL ,
`related_member_id` INT NOT NULL ,
`type` ENUM(  'Child',  'Parent',  'Friend',  'Spouse' ) NOT NULL,
FOREIGN KEY (member_id) REFERENCES members(id),
FOREIGN KEY (related_member_id) REFERENCES members(id)
) ENGINE = INNODB;

UPD: MyISAM-Version (Fremdschlüssel entfernt, alle möglichen Fremdschlüssel-Funktionen sollten von serverseitigen Skripten gehandhabt werden):

CREATE TABLE `members` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`name` TEXT NOT NULL ,
`details` TEXT NOT NULL
) ENGINE = MyISAM;

CREATE TABLE `relations` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`member_id` INT NOT NULL ,
`related_member_id` INT NOT NULL ,
`type` ENUM(  'Child',  'Parent',  'Friend',  'Spouse' ) NOT NULL
) ENGINE = MyISAM;

2voto

Philip Kelley Punkte 38051

Beginnend mit @Minras Entwurf (+1), würde ich

MEMBERS
  MemberId
  Name
  Details

RELATIONS
  FromMemberId
  ToMemberId
  RelationType

Aber anstelle einer Prüfbeschränkung würde ich eine dritte Tabelle hinzufügen:

RELATIONTYPE
  RelationType
  Description
  FromLabel
  ToLabel

wobei RelationType eine ganze Zahl ist und die "Labels" Zeichendaten sind. Die Beziehung ist "direktional", d.h. Sie müssen genau darauf achten, welches Mitglied "von" und welches "bis" ist (was bei "nicht-direktionalen" Beziehungen, wie z.B. "ging zusammen zur High School", nicht so wichtig ist). Dieser Entwurf ermöglicht es Ihnen,:

  • Definieren Sie eine Beziehung zwischen Personen mit mehreren Bezeichnungen, z. B. A is father of B y B is son of A .
  • Fügen Sie neue Beziehungen hinzu, wenn und soweit erforderlich

Natürlich werden Sie entweder relationale Integrität auf alles über Fremdschlüssel oder was auch immer Sie zur Verfügung haben, oder Sie haben einen Zug Wrack warten zu passieren.

Die Frage, wie Mitglieder mit doppelten Namen eindeutig und klar identifiziert werden können, wird dadurch nicht gelöst. Dazu müssen Sie entweder das "Identifizierungsattribut" berücksichtigen, das von Menschen in der realen Welt in solchen Situationen verwendet wird (Studentenausweis? Sozialversicherungsnummer?), oder ein für Ihre Anwendung spezifisches Artefakt einführen (z. B. Login + Passwort).

0voto

Tudor Constantin Punkte 25366

Versuchen Sie, eine Pivot-Tabelle hinzuzufügen:

Relationships:

MemberId1
MemberId2
RelationshipType

0voto

Maciek Punkte 2954

Erstellen Sie eine Tabelle mit Spalten:

Member_1_id
Member_2_id
Relation_type

Dann können Sie es so verwenden: Wenn Alice die Tochter von Bobs ist, dann gibt es diese Beziehungen:

<Bob id> <Alice id> 'Father'
<Alice id> <Bob id> 'Daughter'

Sie können dann einige zusätzliche Daten in diese Beziehungen einfügen, z. B. wann die Beziehung begonnen hat (z. B. wann sich jemand verlobt hat).

Sie können auch Indizes für beide Spalten mit Member-IDs erstellen.

EDIT: Um die Duplizierung von Daten in dieser Tabelle zu vermeiden, können Sie eine Ansicht erstellen und dann jede Beziehung als nur eine Zeile speichern. Mit dieser Lösung können Sie jedoch keine Beziehungen wie "Vater" und "Sohn" benennen.

SELECT member1, member2, relation FROM rel_table UNION ALL SELECT member2, member1, relation FROM rel_table;

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