2011-01-04 9 views
2

Supoose Ich habe folgendes:Speichern von Daten in einer Verknüpfungstabelle

 

tbl_options 
=========== 
id name 
1  experience 
2  languages 
3  hourly_rate 


tbl_option_attributes 
===================== 
id option_id name   value 
1  1   beginner  1 
2  1   advanced  2 
3  2   english  1 
4  2   french  2 
5  2   spanish  3 
6  3   £10 p/h  10 
7  3   £20 p/h  20 


tbl_user_options 
================ 
user_id option_id value 
1   1   2 
1   2   1 
1   2   2 
1   2   3 
1   3   20 

Im obigen Beispiel tbl_user_options speichert Optionsdaten für den Benutzer. Wir können mehrere Einträge für einige Optionen speichern.

Jetzt möchte ich das erweitern, d. H. Für "Sprachen" möchte ich, dass der Benutzer in der Lage ist, seine Kenntnisse in einer Sprache (Basic/Intermediate/Advanced) zu spezifizieren. Es wird auch andere Felder geben, die erweiterte Attribute haben werden.

Also meine Frage ist, können diese erweiterten Attribute in der gleichen Tabelle (tbl_user_options) gespeichert werden oder muss ich mehr Tabellen erstellen? Wenn ich ein Feld "language_proficiency" einfüge, wird es natürlich nicht auf die anderen Felder angewendet. Aber so habe ich nur eine Benutzeroptions-Tabelle zu verwalten. Was denken Sie?

EDIT: Das ist, was ich

 

tbl_user_options 
================ 
user_id option_id value  lang_prof 
1   1   2   null 
1   2   1   2 
1   2   2   3 
1   2   3   3 
1   3   20  null 

Antwort

-1

schlagen Ich denke, es ist ein Fehler „Sprachen“ als Option zu setzen. Beim Lesen Ihres Textes scheint mir, dass Englisch eine Option ist und möglicherweise ein Attribut von option_attributes hat.

0

Sofern Ihr Datenmodell in ständiger Bewegung ist, würde ich lieber tbl_languages und tabl_user_languages Tabellen diese Arten von Daten zu speichern:

tbl_languages 
================ 
lang_id name 
1   English 
2   French 
3   Spanish 

tbl_user_languages 
================ 
user_id lang_id  proficiency hourly_rate 
1   1   1   20 
1   2   2   10 
2   2   1   15 
2   2   3   20 
3   3   2   10 

ein System entwerfen, das „zu allgemein“ ist ein Turing tarpit Falle für ist eine relationale SQL-Datenbank. Eine dokumentenbasierte Datenbank eignet sich besser für beliebige Schlüsselwertspeicher.

Mit Ausnahme bestimmter Optimierungen sollte Ihr Datenbankmodell so genau wie möglich mit Ihrem Domänenmodell übereinstimmen, um die objektbezogene Impedanzfehlanpassung zu minimieren.

Dieses Design können Sie mit nur zwei Innen reiht sich in eine vernünftige Tabelle der Benutzersprache Fertigkeiten und Stundensätze anzuzeigen:

SELECT 
    ul.user_id, 
    u.name, 
    l.name, 
    ul.proficiency, 
    ul.hourly_rate 
FROM tbl_user_languages ul 
INNER JOIN tbl_languages l 
    ON l.lang_id = ul.lang_id 
INNER JOIN tbl_users u 
    ON u.user_id = ul.user_id 
ORDER BY 
    l.name, u.hour 

Optional Sie aufzuschlüsseln können eine Liste der Sprache Fertigkeiten in eine tbl_profiencies Tabelle, wo 1 == Beginner, 2 == Advanced, 3 == Expert und verbinden Sie es auf tbl_user_languages.

+0

Ich sehe. Aber meine Sorge in dieser Situation wäre die Anzahl der zusätzlichen Tabellen zu verwalten. Da es mehr Felder gibt, die zusätzliche Attributdaten enthalten, können bis zu 8-10 Tabellen vorhanden sein, im Gegensatz zu nur zwei. – GSTAR

+0

Können Sie Beispiele für andere Attribute angeben? Normalerweise beziehen sich diese Arten von Attributen auf einen bestimmten Benutzer oder eine bestimmte Sprache, die nur eine zusätzliche Spalte in der entsprechenden Tabelle sein sollte (unter der Annahme von Eins-zu-Eins-Daten). Wenn die Attributwerte hauptsächlich Aufzählungen sind (z. B. "Niedrig", "Mittel", "Hoch"), speichern Sie nur den Wert als Tinyint und ordnen Sie den Wert beschreibendem Text in Ihrer Präsentationsebene zu. Das Verwalten von 8-10 Tabellen in einem RDBMS ist nicht ungewöhnlich. Um Abfragen zu beschleunigen, verwenden Sie Ansichten, um die Daten zu verknüpfen. –

+0

Ja, sie sind nur Aufzählungen, ähnlich den Sprachen. Schau dir meinen Schnitt an, da er eine bessere Vorstellung davon geben könnte, was ich meine. – GSTAR

1

Mein Bauchgefühl wäre, die Beziehung zwischen Benutzer/Sprache/Kompetenz in eigene Tabellen aufzuteilen. Selbst wenn Sie es in der gleichen Tabelle mit Ihren anderen Optionen aufbewahren würden, müssten Sie speziellen Code schreiben, um den Sprachfall zu behandeln, also können Sie auch eine neue Tabellenstruktur verwenden.

+0

Bitte sehen Sie meine Bearbeitung. – GSTAR

+0

@GSTAR: Ich bin mir nicht sicher, dass es in dieser Situation eine endgültige richtige/falsche Antwort gibt. Wenn Sie mit diesem Ansatz vertraut sind, sehe ich kein echtes Problem damit. –

+0

Kühl. Es ist immer eine gute Idee, die Meinung anderer Leute zu bekommen, obwohl ich das Gefühl hatte, dass es eine der persönlichen Präferenzen sein würde :) – GSTAR

Verwandte Themen