MySQL: Diskriminator Feld vs mehrere Tabellen

Tommy57

Erfahrenes Mitglied
Hallo,

ich habe momentan echt Schwierigkeiten, mich zu entscheiden. Vielleicht kann mir jemand helfen oder einen Tipp geben.

Ich arbeite an einer Software, wo man Beiträge mit unterschiedlichen Entitäten verlinken kann. Ich will damit sagen, dass ein Beitrag zum Beispiel mit User 12 verlinkt sein kann und User 13, sowie Ort 27 und Anlass 31.

Diese Verlinkungen werden aktuell alle in einer Tabelle abgespeichert und so, wie ich das gestern gelesen habe, verwende ich ein sogenanntes Diskriminator Feld, also eine Spalte, über die ich erfahre, in welcher Tabelle ich meinen Wert suchen muss. Aktuell gibt es knapp zehn Tabellen, auf die verwiesen werden kann.

Ich frage mich, ob es nicht geschickter wäre, zehn Tabellen zu verwenden, statt eine Tabelle mit dieser Zusatz-Spalte. Dann könnte ich auch zum Beispiel Foreign-Keys verwenden, was aktuell ja nicht geht.

Kennt jemand vielleicht Gründe dafür oder dagegen, oder stand auch mal vor einem ähnlichen Problem.

Ich habe mal Beispieldaten erstellt, wie es aktuell aufgebaut ist:
http://sqlfiddle.com/#!2/20c8e9/2

Gruß, Tommy
 
Du schreibst es bereits. Kein ForaignKey, dafür nicht zig Tabellen.

Im NEdeffekt kommt es auch sehr darauf an, was du mit den Daten machen willst
 
Ich hatte gerade noch eine dritte Idee:

Ich könnte die image Tabelle um rund 10 Spalten erweitern und die IDs mit nem Prefix und Suffix und einem Separator dort hineinschreiben. Beispiel: Spalte user => '(2),(5),(6)'

Mein Problem ist die Art, wie ich Abfrage. Irgendwann haben wir da mehrere Millionen Zeilen und ich arbeite mit EXISTS und NOT EXISTS, um eine Suche über mehrere Attribute, also kombinierte Attribute zu machen. Das ist übrigens die Hauptfunktion der Apllikation, die ich grad entwickle.

Hier mal ein Beispiel, wie so eine Abfrage bei mir aussieht:
http://sqlfiddle.com/#!2/994f3c/7

Bei mehreren Tabellen hätte ich zwar den Vorteil mit den Foreign-Keys, aber oberste Priorität haben Performance und Einfachheit der SQL-Statements. Das im Beispiel ist total umständlich und extrem unperformant.

Gruß, Tommy

EDIT:
Ach ja, um das Kind beim Namen zu nennen, es geht um Assoziationstabellen. Ich habe im Prinzip rund 10 Assoziationen.

Und zur Auswahl habe ich aktuell:
- 10 Extra Spalten (hätte wohl das einfachste SQL-Statement)
- 1 Assoziationstabelle
- 10 Assoziationstabellen (etwas performanter als eine Tabelle und Foreign-Keys)
 
Zuletzt bearbeitet:
Die Dritte Idee ist nix. Vergiss sie.

Üer Exists ist aber kompliziert
SQL:
SELECT
   x0.image
FROM
   link AS x0,
   link AS x1
WHERE
   x0.image = x1.image
   AND x0.type_id = 1
   AND x0.type_value = 2
   AND x1.type_id = 3
   AND x1.type_value = 4

-- oder
SELECT
   x0.image
FROM
   (SELECT image FROM link WHERE type_id = 1 AND type_value = 2)  AS x0
   LEFT JOIN (SELECT image FROM link WHERE type_id = 3 AND type_value = 4)  AS x1
     ON xo.image = x1.image
 
Ich werde die Statements gleich mal testen. Das sieht echt gut aus.

Ich verwende aktuell nur eine Tabelle für die Applikation. Der Umbau auf zehn Tabellen würde mich nur ein paar Stunden kosten. Sollte ich es vielleicht besser umbauen?

Ich könnte auch vorerst zehn Tabellen anlegen und eine View, wo alle zusammengewürfelt werden, wie es bisher der Fall ist. Dann bräuchte ich auch nicht sofort alles in der Applikation umschreiben.

EDIT: Wegen deiner Statements, ich benutze auch den Fall NOT EXISTS. Was würdest du denn da vorschlagen?
 
Zuletzt bearbeitet:
Super, danke^^

Und noch mal die Frage wegen dem Umbau:

Sollte ich die eine Assoziationstabelle auf zehn Tabellen verteilen?
 
Zurück