Angenommen, ich habe eine Tabelle User_FriendList
mit den folgenden Eigenschaften:
CREATE TABLE User_FriendList (
ID ...,
User_ID...,
FriendList_IDs...,
CONSTRAINT User_Friendlist_PK PRIMARY KEY (ID)
);
Nehmen wir an, dass diese Tabelle die folgenden Daten enthält:
+ ---- + --------- + --------------------------- + | ID | Benutzer_ID | Friendlist_IDs | + ---- + --------- + --------------------------- + | 1 | 102 | 2: 15: 66: 35: 26: 17: | + ---- + --------- + --------------------------- + | 2 | 114 | 1: 12: 63: 33: 24: 16: 102 | + ---- + --------- + --------------------------- + | 3 | 117 | 6: 24: 52: 61: 23: 90: 97: 118 | + ---- + --------- + --------------------------- +
Hinweis: Das ":" (Doppelpunkt) ist das Trennzeichen, wenn in PHP in ein explodiert wirdarray
.
Fragen
So:
Ist dies eine bequeme Möglichkeit, das
IDs
von a zu „speichern“FriendList
?Oder sollte ich stattdessen einzelne Zeilen mit jeweils nur einem
FriendId
Wert haben und, wenn ich alle Zeilen einer bestimmten Liste abrufen muss , einfach eine Abfrage wie ausführenSELECT * FROM UserFriendList WHERE UserId = 1
?
Antworten:
Verwalten einer einzelnen Information
Angenommen, in Ihrer Geschäftsdomäne
dann repräsentiert jedes spezifische Datum, das in der
Friendlist_IDs
mehrwertigen Spalte gesammelt wird, eine separate Information , die eine sehr genaue Bedeutung hat. Daher die SpalteKurze Antwort
Folglich sollten Sie jeden der
Friendlist_IDs
Werte in (a) einer Spalte beibehalten , die ausschließlich einen einzigen Wert pro Zeile in (b) einer Tabelle akzeptiert, die den Assoziationstyp auf konzeptioneller Ebene darstellt , der zwischen Benutzern stattfinden kann , dh eine Freundschaft - wie Ich werde in den folgenden Abschnitten veranschaulichen -.Auf diese Weise werden Sie in der Lage zu handhaben (i) die Tabelle als eine mathematische Beziehung und (ii) die Säule als eine mathematische Beziehung Attribut -wie viel wie MySQL und seine SQL - Dialekt erlauben, von Kurs-.
Warum?
Da das von Dr. E. F. Codd erstellte relationale Datenmodell Tabellen erfordert, die aus Spalten bestehen, die genau einen Wert der zutreffenden Domäne oder des jeweiligen Typs pro Zeile enthalten. Daher stellt die Deklaration einer Tabelle mit einer Spalte, die mehr als einen Wert der betreffenden Domäne oder des fraglichen Typs (1) enthalten kann, keine mathematische Beziehung dar und (2) würde es nicht ermöglichen, die im oben genannten theoretischen Rahmen vorgeschlagenen Vorteile zu erzielen.
Modellieren von Freundschaften zwischen Benutzern : Definieren Sie zuerst die Regeln für die Geschäftsumgebung
Ich empfehle dringend, eine Datenbank zu erstellen, die - vor allem - das entsprechende konzeptionelle Schema aufgrund der Definition der relevanten Geschäftsregeln abgrenzt , die unter anderem die Arten von Wechselbeziehungen beschreiben müssen, die zwischen den verschiedenen interessierenden Aspekten bestehen, d. H. , die anwendbaren Entitätstypen und ihre Eigenschaften ; z.B:
Expository IDEF1X-Diagramm
Auf diese Weise konnte ich das in Abbildung 1 gezeigte IDEF1X 1- Diagramm ableiten , das die meisten zuvor formulierten Regeln integriert:
Wie dargestellt, sind Anforderer und Adressat Bezeichnungen, die die Rollen ausdrücken, die von den spezifischen Benutzern ausgeführt werden , die an einer bestimmten Freundschaft teilnehmen .
Unter diesen Umständen zeigt der Entitätstyp " Freundschaft" einen Assoziationstyp mit einem Kardinalitätsverhältnis von vielen zu vielen (M: N), der verschiedene Vorkommen desselben Entitätstyps, dh Benutzer, umfassen kann . Als solches ist es ein Beispiel für das klassische Konstrukt, das als "Stückliste" oder "Teileexplosion" bekannt ist.
1 Integration Definition für Information Modeling ( IDEF1X ) ist eine sehr empfehlenswerte Technikdie als etabliert wurde Standard im Dezember 1993 von der US National Institute of Standards and Technology (NIST). Es basiert fest auf (a) dem frühen theoretischen Material, das vom alleinigen Urheber des relationalen Modells verfasst wurde, dh Dr. EF Codd ; zu (b) dervon Dr. PP Chen entwickelten Entity-Relationship- Ansicht von Daten; und auch auf (c) der Logical Database Design Technique, erstellt von Robert G. Brown.
Illustratives logisches SQL-DDL-Design
Aus dem oben dargestellten IDEF1X-Diagramm ist es dann viel „natürlicher“, eine DDL-Anordnung wie die folgende zu deklarieren:
In dieser Mode:
Vorteile einer einwertigen Spalte
Wie gezeigt, können Sie z.
Nutzen Sie die referenzielle Integrität, die vom Datenbankverwaltungssystem (DBMS für die Kürze) für die
Friendship.AddresseeId
Spalte erzwungen wird , da die Einschränkung als AUSLÄNDISCHER SCHLÜSSEL (FK für die Kürze), der auf dieUserProfile.UserId
Spalte verweist, garantiert, dass jeder Wert auf eine vorhandene Zeile verweist .Erstellen Sie einen zusammengesetzten PRIMARY KEY (PK), der aus der Kombination von Spalten besteht
(Friendship.RequesterId, Friendship.AddresseeId)
und dabei hilft, alle eingefügten Zeilen elegant zu unterscheiden und natürlich ihre Eindeutigkeit zu schützen .Dies bedeutet natürlich, dass das Anhängen einer zusätzlichen Spalte für vom System zugewiesene Ersatzwerte (z. B. eine Spalte, die mit der IDENTITY- Eigenschaft in Microsoft SQL Server oder mit dem AUTO_INCREMENT- Attribut in MySQL eingerichtet wurde) und dem unterstützenden INDEX völlig überflüssig ist .
Beschränken Sie die beibehaltenen Werte
Friendship.AddresseeId
auf einen genauen Datentyp c (der z. B. dem fürUserProfile.UserId
INT festgelegten Datentyp entsprechen sollte ), damit das DBMS die entsprechende automatische Validierung übernimmt .Dieser Faktor kann auch dazu beitragen, (a) die entsprechenden integrierten Typfunktionen zu nutzen und (b) die Speicherplatznutzung zu optimieren.
Optimieren Daten Retrieval auf der physikalischen Ebene durch die Konfiguration kleinen und schneller untergeordneten Indizes für die
Friendship.AddresseeId
Spalte, da diese physikalischen Elemente im wesentlichen durch in unterstützen die Beschleunigung der Abfragen , die Spalte sagte beinhalten.Natürlich können Sie beispielsweise einen einspaltigen INDEX für sich
Friendship.AddresseeId
allein erstellen , einen mehrspaltigen, derFriendship.RequesterId
undFriendship.AddresseeId
oder beides umfasst.Vermeiden Sie die unnötige Komplexität, die durch das „Suchen“ nach bestimmten Werten entsteht, die in derselben Spalte zusammengefasst sind (sehr wahrscheinlich dupliziert, falsch eingegeben usw.). Diese Vorgehensweise würde möglicherweise die Funktion Ihres Systems verlangsamen, weil Sie dies tun würden müssen auf ressourcen- und zeitaufwändige nicht relationale Methoden zurückgreifen, um diese Aufgabe zu erfüllen.
Es gibt mehrere Gründe, die eine sorgfältige Analyse des relevanten Geschäftsumfelds erfordern, um den Typ d jeder Tabellenspalte genau zu kennzeichnen .
Wie bereits erläutert, ist die Rolle des Datenbankdesigners von größter Bedeutung, um (1) die Vorteile des relationalen Modells auf logischer Ebene und (2) die vom DBMS der Wahl bereitgestellten physikalischen Mechanismen optimal zu nutzen .
a , b , c , d Offensichtlich können Sie bei der Arbeit mit SQL-Plattformen (z. B. Firebird und PostgreSQL ), die die DOMAIN-Erstellung unterstützen (eine besondere relationale Funktion), Spalten deklarieren, die nur Werte akzeptieren, die zu ihren jeweiligen gehören (entsprechend eingeschränkt und manchmal) geteilt) DOMAINs.
Ein oder mehrere Anwendungsprogramme, die die betreffende Datenbank gemeinsam nutzen
Wenn Sie
arrays
den Code der Anwendungsprogramme verwenden müssen, die auf die Datenbank zugreifen, müssen Sie lediglich die relevanten Datensätze vollständig abrufen und sie dann an die betreffende Codestruktur „binden“ oder ausführen zugehörige App-Prozesse, die stattfinden sollen.Weitere Vorteile einwertiger Spalten: Datenbankstrukturerweiterungen sind viel einfacher
Ein weiterer Vorteil des Haltens des
AddresseeId
Datenpunkts in seiner reservierten und ordnungsgemäß typisierten Spalte besteht darin, dass die Erweiterung der Datenbankstruktur erheblich erleichtert wird, wie ich weiter unten veranschaulichen werde.Fortschreiten des Szenarios: Einbeziehung des Friendship Status- Konzepts
Da sich Freundschaften im Laufe der Zeit entwickeln können, müssen Sie möglicherweise ein solches Phänomen im Auge behalten. Daher müssten Sie (i) das konzeptionelle Schema erweitern und (ii) einige weitere Tabellen im logischen Layout deklarieren. Lassen Sie uns also die nächsten Geschäftsregeln festlegen, um die neuen Eingliederungen abzugrenzen:
Erweitertes IDEF1X-Diagramm
Nacheinander kann das vorherige IDEF1X-Diagramm erweitert werden, um die oben beschriebenen neuen Entitätstypen und Wechselbeziehungstypen einzuschließen. Ein Diagramm mit den vorherigen Elementen, die den neuen Elementen zugeordnet sind, ist in Abbildung 2 dargestellt :
Logische Strukturergänzungen
Anschließend können wir das DDL-Layout mit den folgenden Deklarationen verlängern:
Folglich müssten die Benutzer jedes Mal, wenn der Status einer bestimmten Freundschaft auf den neuesten Stand gebracht werden muss, nur eine neue Zeile einfügen , die Folgendes enthält:
FriendshipStatus
die geeigneten
RequesterId
undAddresseeId
Werte - entnommen aus der betreffendenFriendship
Zeile -;der neue und bedeutungsvolle
StatusCode
Wert - gezogen vonMyStatus.StatusCode
-;der genaue INSERTion-Zeitpunkt, dh -
SpecifiedDateTime
vorzugsweise mithilfe einer Serverfunktion, damit Sie sie zuverlässig abrufen und aufbewahren können -; undDer
SpecifierId
Wert, der den jeweiligen Wert angibt, derUserId
das NeueFriendshipStatus
in das System eingegeben hat - idealerweise mithilfe Ihrer App-Funktionen.Nehmen wir insofern an, dass die
MyStatus
Tabelle die folgenden Daten enthält - mit PK-Werten, die (a) Endbenutzer-, App-Programmierer- und DBA-freundlich und (b) klein und schnell in Bezug auf Bytes auf der Ebene der physischen Implementierung sind -:Die
FriendshipStatus
Tabelle kann also Daten wie unten gezeigt enthalten:Wie Sie sehen können, kann gesagt werden, dass die
FriendshipStatus
Tabelle dem Zweck dient, eine Zeitreihe zu umfassen .Relevante Beiträge
Sie könnten genauso gut interessiert sein an:
quelle