Ich bin gerade dabei, eine Datenbank für eine neue PHP / MySql-basierte Anwendung zu entwerfen.
Mein Problem ist, dass ich nicht darstellen kann und kann, was in der Datenbank gespeichert werden soll, da es unbegrenzt ist und sich ändert.
Hier ist das Problem Beispiel: Die Anwendung wird eine Shopping - Website, dass viele Arten von Produkten , alle von ihnen haben einige gemeinsamen Attribute wie hat title
und price
aber einige Arten haben spezifische Details wie expiry date
einige haben isbn
einige nicht.
Dies ist nur ein Beispiel, aber ich habe wirklich viele Arten mit vielen verschiedenen Attributen.
Ich kann für jede Art eine Tabelle erstellen, aber ich habe nicht alle verfügbaren Arten, viele Arten von Gegenständen sind derzeit unbekannt.
Ist dies eine Möglichkeit, dieses Problem zu lösen, ohne den Benutzer zu überfordern?
quelle
Books
,Music
, usw.) und EAV für die selteneren Datenattribute.Antworten:
Unbekannte Arten von Daten klingen für mich etwas faul. Ihre Beispiele sind natürlich alle bekannt. Für Waren und Dienstleistungen sind sorgfältige Analysen und Normalisierungen wichtig, und ich denke, Sie können sich von der EAV-Modellierung (von der ich denke, dass sie mehr Probleme verursacht als löst) für Kerndaten lösen. Der Rest könnte in XML-Felder oder ähnliches gestopft werden. Wenn Sie Ihr Design richtig machen, können Sie die Informationen außerdem jederzeit entsprechend erweitern. Betrachten Sie die folgenden drei Tabellen:
Jetzt können Sie verschiedenen Teilen Barcodes (einschließlich ISBN, EAN, UPC usw.) zuweisen, einen pro Marke / Modell-Kombination. Wenn Sie mehr Barcode-Typen unterstützen müssen, ist dies nicht schwer hinzuzufügen. Wohin diese gehen, hängt davon ab, wo Sie sie verfolgen. Wenn Sie temporäre Preise oder Preise für Kundengruppen wünschen, können Sie dies auch hinzufügen.
Was Sie beschreiben, klingt jedoch nicht sehr unstrukturiert. Ich würde vorschlagen, mit einem minimalen Design zu beginnen und nach Bedarf zu erweitern, anstatt mit einem EAV-Design, und es später zu bereuen.
quelle
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
Ausredenproblemekönnen vermieden werden. Zum Beispiel sagte @KookieMonster, dass Sie nicht erzwingen können, dass ein Benutzer keine zwei Geburtsdaten hat, aber das ist einfach:(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 ...
quelle
Verwenden Sie nicht MySQL, eine relationale Datenbank wird nicht zur Lösung dieser Art von Problem verwendet. Verwenden Sie ein Dokument oder eine NoSQL-Datenbank wie MongoDB oder möglicherweise RavenDB unter Windows.
Oder verwenden Sie alternativ PostgreSQL. Wenn Sie einen Basissatz von Attributen haben, können Sie Vererbung in Ihre Tabellen einbauen
dann für die anderen Gegenstände sagen Bücher oder Essen
Machen Sie Ihre Daten
und
quelle
Wenn diese Datenbank in irgendeiner Weise mit dem verbunden ist, was Ihre Verbraucher kaufen, wird die Leistung bald eines Ihrer wichtigsten Probleme sein. Ich sage nicht, dass EAV keinen Platz in der Datenbankwelt hat, aber Sie werden mit diesem Modell wahrscheinlich mehr Probleme als Antworten bringen. Da ich eine solche Datenbank (von Drittanbietern) selbst verwalten muss, sind folgende Punkte zu beachten:
Die Leistung kann ziemlich schnell schlecht werden: Wenn Sie alle Felder für ein bestimmtes Produkt, einen bestimmten Kunden, abrufen möchten, müssen Sie die LEFT JOINs multiplizieren, da jedes Attribut in einer anderen Zeile gespeichert wird. Stellen Sie sich nun vor, Sie hätten Hunderte von Feldern zum Verbinden.
Datenintegrität: Es wird schwierig sein, sie durchzusetzen. Zum Beispiel hindert niemand den Kunden daran, zwei (oder mehr) Geburtsdaten zu haben. Wenn isbn für Bücher erforderlich ist, wie stellen Sie sicher, dass dies der Fall ist? Was ist der Feldtyp Ihres Geburtstagsfeldes? Sie können eine Menge Code haben, der Ihnen dabei hilft, aber das Schreiben ist schwierig und langwierig und wirkt sich sicherlich auf die Leistung aus.
Die Liste kann weitergehen, und meine Lieblingslesung zu diesem Thema ist Pragmatic SQL Antipatterns von Bill Karwin. Sie können sich auch dieses Video, SQL Best Practices, in weniger als 20 Minuten ansehen . Unser Anbieter kann seine Architektur jetzt nicht ändern (würde monatelange Neugestaltung erfordern) und es häufen sich Probleme für unser Datenvolumen. Wägen Sie die Vor- und Nachteile sorgfältig ab, bevor Sie diesen Weg gehen.
quelle