2016-11-07 1 views
1

Ich entwickle eine klassifizierte Website mit asp.net und meine DB ist mysql. Bitte MSSQL-Benutzer Ich brauche auch deine Unterstützung. Dies ist ein Problem mit dem Datenbankschema, das sich nicht auf einen bestimmten Datenbankanbieter bezieht.Soll ich für jede Kategorie oder eine Tabelle separate Tabellen verwenden, um alle Attribute für eine klassifizierte Website zu speichern?

Ich möchte nur ein wenig Klärung von Ihnen.

da dies hier ist also ein klassifiziertes Website Sie Job-Anzeigen veröffentlichen können, Fahrzeugwerbung, Immobilienanzeigen etc ...

Also habe ich eine Header-Tabelle haben gemeinsame Einzelheiten über die Anzeige zu speichern. wie Titel, Beschreibung und so weiter.

CREATE TABLE `ad_header` (
    `ad_header_id_pk` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `district_id_fk` tinyint(5) unsigned NOT NULL, 
    `district_name` varchar(50) DEFAULT NULL, 
    `city_id_fk` tinyint(5) unsigned DEFAULT NULL, 
    `city_name` varchar(50) DEFAULT NULL, 
    `category_id_fk` smallint(3) unsigned NOT NULL, 
    `sub_category_id_fk` smallint(3) unsigned DEFAULT NULL, 
    `title` varchar(100) NOT NULL, 
    `description` text NOT NULL, 
    ............... 
    PRIMARY KEY (`ad_header_id_pk`), 
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 

Also, wenn es ein Job aufgeben ich einen anderen Tisch für die relevanten Attribute zu speichern, nur auf eine Stellenanzeige wie Gehalt, Beschäftigungsart, Arbeitszeit

Auch wenn es sich um ein Fahrzeug ad I haben Sie getrennte Tabelle, um Brennstoffart, Getriebetyp usw. zu speichern ...

So habe ich 10 Kategorien. Diese Kategorien werden sich in einem Jahrzehnt nicht ändern. So, jetzt habe ich diese zwei Ansätze

1) Eine Kopftabelle und 10 spezifische Tabellen zu speichern, die jeweils Kategorien Attribute

2) Eine Kopftabelle und eine Attributtabelle , die alle Attribute jeden halten und jede klassifizierte Gruppe. für diejenigen, die nicht relevant sind, halten NULL-Werte

Was ist der beste Weg, dies in Bezug auf Leistung und Skalierbarkeit zu tun.

Für diejenigen, die klassifizierte Websites erstellen, geben Sie mir bitte eine Anleitung. Vielen Dank im Voraus

+0

Kondolenz auf die MySql-Wahl. Während ich mit dem Wunsch nach einer offenen und kostengünstigen DB sympathisiere, ist MySql seit über einem Jahrzehnt hinter Oracle, Sql Server und PostgreSQL zurückgeblieben, und Postgresql ist ebenfalls offen und kostengünstig. –

+0

@JoelCoehoorn Bei allem Respekt Ihre Antwort bezieht sich nicht auf meine Frage :) – Sylar

Antwort

3

Die Frage, die ich nicht ganz klar, aber ich kann einen Rat geben:

Vor allem, wenn Sie sich getrennte Werte in einer einzigen Spalte/Zelle speichern finden wollen, müssen Sie Schritt zurück und erstellen Sie eine neue Tabelle, um diese Informationen zu halten. Speichern Sie niemals abgegrenzte Daten in einer einzelnen Spalte.

Wenn ich Ihre Frage richtig verstanden hat, haben AdsCategories wie „Job“, „For Sale“, „Fahrzeug“, „Real Estate“, usw. Categories dann Attributes haben sollte, wo Attribute einzigartige Dinge, die jede Kategorie sein könnten B. "Transmission Type" oder "Mileage" für die Kategorie "Vehicle" oder "Square Feet" oder "Year Constructed" für die Kategorie "Real Estate".

Es gibt mehr als einen richtigen Weg, um mit dieser Situation umzugehen. Wenn die Master-Kategorien etwas festgelegt sind, ist es eine legitime Design-Entscheidung, eine separate Tabelle für die Attribute aus jeder Kategorie zu haben, so dass jede Anzeigenliste einen Datensatz von ad_header und einen Datensatz aus der spezifischen Attribute-Tabelle enthält für diese Kategorie. Eine Fahrzeugliste hätte also einen ad_header Datensatz und einen vehicle_attributes Datensatz.

Wenn die Kategorien fließender sind, ist es auch eine legitimes Design Wahl in diesem Fall einen CateogryAttributes Tisch zu haben, dass die Attribute mit jeder Kategorie, zusammen mit einer Ad_Listing_Attributes Tabelle verwendet wird, definiert, die die Attributdaten für jeden Eintrag hält, das würde sowohl CategoryAttributes als auch Ad_header einen Fremdschlüssel enthalten. Beachten Sie, dass das Schema für diese Tabelle effektiv dem Entity/Attribute/Value-Muster folgt, das weithin als eher ein Anti-Pattern-Muster angesehen wird. Das heißt, es ist in den meisten Fällen etwas zu vermeiden. Wenn Sie jedoch häufig neue Kategorien hinzufügen, ist dies möglicherweise das Beste, was Sie hier tun können.

Eine letzte Option besteht darin, Attribute aus allen Kategorien in eine einzige große Tabelle einzutragen und nur das zu füllen, was Sie benötigen. So hätte eine Fahrzeugliste nur einen ad_header Datensatz, aber es würde viele NULL Spalten im Datensatz geben. Ich würde das in diesem Fall vermeiden, weil Ihr Ideal-Szenario einige Attribute für bestimmte Kategorien erfordern würde (dh: NICHT NULL-fähige Spalten), aber andere Optionen lassen.

Dies ist ein weiterer Fall, in dem Postgresql die bessere DB-Wahl gewesen sein könnte. Postgresql verfügt über eine sogenannte Tabellenvererbung, die speziell dafür entwickelt wurde, diese Situation zu umgehen, damit Sie ein EAV-Tabellenschema vermeiden können.


Vollständige Offenlegung: Ich bin eigentlich ein SQL Server-Typ für die meisten Situationen, aber es scheint wie Postgresql eine bessere Passform für Sie sein kann. Meine Erfahrung ist, dass MySql in den späten 90ern und frühen 00ern gut war, aber seitdem wirklich zurückgeblieben ist. Es ist weiterhin beliebt heute vor allem wegen dieser frühen Dynamik zusammen mit einigen Vorteil in der Verfügbarkeit von günstigen Hosting, anstatt jeden echten technischen Verdienst.

+0

Danke Joel..So ist Ihre endgültige Entscheidung? Eine Header-Tabelle mit mehreren Attributtabellen oder eine Header-Tabelle mit einer Attributtabelle? – Sylar

+0

Wie ich schon sagte .. es hängt von der Art Ihrer Website ab. Wie sehr werden sich diese Attribute im Laufe der Zeit verändern? Die frühere Option sollte wahrscheinlich dem Standpunkt der theoretischen Reinheit vorgezogen werden, aber wenn Sie diesen Weg gehen, wird jedes neue Attribut nach dem Start zu einer Kategorie führen. Wenn Sie dies häufig beobachten, sollten Sie die EAV-Option in Betracht ziehen. –

Verwandte Themen