Es gibt hier einige SQL Server-Besonderheiten, aber ich gebe meinen Überblick über EAV im Allgemeinen . Es ist nicht der Teufel, für den es oft gehalten wird, und einige der typischen Ausredenprobleme können vermieden werden. Zum Beispiel sagte @KookieMonster, dass Sie nicht erzwingen können, dass ein Benutzer keine zwei Geburtsdaten hat, aber das ist einfach:
CREATE TABLE dbo.Users
(
UserID INT PRIMARY KEY,
Username NVARCHAR(255) UNIQUE
--, ...
);
CREATE TABLE dbo.Properties
(
PropertyID INT PRIMARY KEY,
Name SYSNAME UNIQUE
--, ...
);
CREATE TABLE dbo.UserProperties
(
UserID INT FOREIGN KEY ...,
PropertyID INT FOREIGN KEY ...,
DateValue DATE,
IntValue INT,
-- ...
PRIMARY KEY(UserID, PropertyID)
);
(Auch dies ist die SQL Server-Syntax, aber hoffentlich stimmt das Konzept überein.)
Wenn die Logik komplexer ist (z. B. können sie drei Telefonnummern, aber nur ein Geburtsdatum haben), wird sie etwas komplizierter, aber Sie können dennoch Dinge, die Ihrer Geschäftslogik entsprechen, mithilfe von Triggern, gespeicherten Prozeduren usw. durchsetzen Ich weiß nicht, wie eine andere Lösung dieses Problem besser lösen kann, ohne gleichzeitig andere vorzustellen.
Die Leistung kann ein Problem sein, wir haben dies jedoch in SQL Server 2008+ mithilfe gefilterter Indizes (für bestimmte Eigenschaften) und verzögerter Materialisierung denormalisierter Versionen der Tabellen gelöst. Für Eigenschaftensätze, die sich langsam ändern, ist es einfach, Hintergrundprozesse zu erstellen, die die Tabellen reduzieren, sodass Sie für bestimmte oder alle Produkte eine materialisierte, schwenkbare Version der Daten haben, um alle Verknüpfungen zu vermeiden. Wie das in MySQL funktionieren würde, weiß ich nicht genau, daher werde ich keine Syntax bereitstellen, aber vielleicht werde ich aus der SQL Server-Perspektive weiter darüber bloggen ...