Ich möchte eine Tabelle entwerfen, um die Freundschaftsbeziehung in meinem Webprojekt zu speichern
Es sollte mindestens die folgenden 4 Bedingungen erfüllen:
Wer sendet die Add-Friend-Anfrage, zB (wenn A bis B, dann ist diese Spalte A)
die die Add-Friend-Anfrage erhalten, z. B. (wenn A bis B, dann ist diese Spalte B)
aktueller Status zB (0 bedeutet abgelehnt, während 1 akzeptiert oder 2 unverarbeitet bedeutet
Unsere freundschaftliche Beziehung ist bilateral
Wenn einer von Ihnen damit vertraut ist, ist jeder Vorschlag willkommen
Mein aktuelles Design (ich denke im Moment schlecht) ist so, das sind die Spalten
frienshipId
fromUserId
toUserId
status
requestTime
database-design
Hallo 福气 鱼
quelle
quelle
Antworten:
Ich würde eine Tabelle erstellen, die der von Ihnen sehr ähnlich ist. Ich verwende SQL Server-Datentypen und -Syntax. Je nach Plattform müssen Sie möglicherweise Anpassungen vornehmen.
Die Indizierung der Tabelle ist von entscheidender Bedeutung, wenn die Tabelle auf Dutzende und Hunderte von Millionen anwächst.
quelle
Auf PostgreSQL:
Zum Auflisten von Freundschaften eine Ansicht:
Sie können es so verwenden:
quelle
Was lässt Sie denken, dass Ihr aktuelles Design schlecht ist? Hier ist eine Tabelle zum Erstellen für Oracle:
Wenn es sich bei der Datenbank um Oracle handelt, sollten Sie eine indizierte virtuelle Spalte in Betracht ziehen, die die Daten auf Einträge beschränkt, die für bestimmte Abfragen erforderlich sind. Beispielsweise könnten Sie eine virtuelle Spalte mit dem Namen AcceptedFromUserId haben, die die Funktion DECODE (StatusId, 1, FromUserId, NULL) verwendet. Der Index würde nur AcceptedUserIds enthalten und wäre daher kleiner als ein Index für alle UserIds. Wenn Sie abgelehnte Anforderungen regelmäßig bereinigen, ist eine indizierte virtuelle Spalte in PendingToUserId möglicherweise nützlicher.
Eine Alternative, wenn Sie eine Partitionierung hätten, wäre die Partitionierung der Tabelle auf der StatusId.
Wenn Sie nicht mehrere Freundschaftsanfragen zwischen denselben Benutzern gleichzeitig benötigen, können Sie die FriendId mit FromUserId, ToUserId und StatusId als Primärschlüssel verlassen. In diesem Fall sollten Sie auch in Betracht ziehen, die Tabelle zu einer indexorganisierten Tabelle zu machen.
quelle
Schema:
Von PHP:
quelle
friends
Tabellendefinition ist verdächtig für Syntaxfehler.)