2009-04-03 25 views
1

Angenommen, ich eine Tabelle mit den folgenden Spalten (eine Liste von Worten):Single-Table-Vererbung oder zwei Tabellen?

word: varchar 
contributor: integer (FK) 

Nun, ich nehme an Übersetzungen für jedes „Wort“ haben wollte. Was wäre das Beste? Einen zweiten Tisch haben?

word: integer (FK) 
translation: varchar 
contributor: integer (FK) 
lang: integer (FK) 

Oder alle in der gleichen Tabelle?

word: varchar 
translation_for: integer (FK - to the same table) 
contributor: integer (FK) 
lang: integer (FK) 

Es wäre zwei Szenarien (1), wo ich ein übersetztes Wort ziehen zusammen mit dem ursprünglichen Wort, um es von übersetzt wurde, (2), wo ich brauche nur das übersetzte Wort zu ziehen. In beiden Szenarien würde ich die "ursprünglichen" Wörter viel stärker verwenden (sowohl SELECT als auch UPDATEing/INSERTing).

Also, welcher Ansatz wäre am besten für jedes Szenario oder im Allgemeinen? Ich bin zum ersten Ansatz geneigt, da dann meine "Standard" SELECTs nicht durch die Spalte lang qualifiziert werden müssen. Was denken Sie?

Danke!

Antwort

1

Ich denke, Sie werden später weh tun, wenn Sie später eine Sprache hinzufügen möchten, wenn Sie die Datenbank jetzt nicht normalisieren. Haben Sie eine Worttabelle, in der das Wort in der Standardsprache ist. Es hat eine ID. Haben Sie eine Sprachtabelle mit einer ID (z. B. Spanisch, 2) und eine Übersetzungstabelle, die das Wort ID, die Sprachen-ID und schließlich das tatsächliche Wort in dieser Sprache enthält. Dies ist die verknüpfte Tabelle.

Verwenden Sie eine Ansicht für Ihre Abfragen, aber für Einfügungen und Aktualisierungen benötigen Sie abhängig von Ihrem DBMS möglicherweise harte Abfragen.

Dies wird nur vorausgesetzt, dass Sie versuchen, die Lokalisierung bereitzustellen, und wahrscheinlich später weitere Sprachen hinzufügen werden. Dies ist einfacher, als wenn Sie Ihre Datenbank so anpassen müssen, dass bei jedem Hinzufügen einer Sprache Spalten hinzugefügt werden. Wenn Sie wirklich nur EINE Übersetzung brauchen und sehr bezweifeln, dass Sie jemals eine andere brauchen, dann wäre es einfach, nur die eine Spalte hinzuzufügen.

0

Da Sie scheinen, ein "Wort" zu wollen, um eine Identität getrennt von einem "übersetzten Wort" zu haben, dann denke ich, dass die 1. Option Ihre Bedürfnisse besser erfüllt.

Normalerweise würde ich denke, ein Design eher wie:

PK (Key (varchar), Lang (FK)), Word (nvarchar) 

wäre besser geeignet sein - wo man nur auf Text verweisen, indem sie Schlüssel und Lang Wert. Aber es sieht so aus, als würden Sie Key durch das "Originalwort" ersetzen - das macht es etwas anders.