vielen Dank für deine Antwort,
Du hast ja den rechtschreibfehlerlastigen und etwas flapsigen Beitrag mit Humor (zumindest genommen, wir haben noch nicht viel weiter gelesen ;) ausgehalten.
In diesem Thread [3] wird wiederum die gleiche Thematik beleuchtet vor allem geht es dort darum wie weit man Normalisieren soll und darf.
Ganz wichtig ist bei der Sache mit der Normalisierung, dass man _nicht_ prinzipienfest bleibt.
Dein Standpunkt dort war ein "sauberes" Design, Performance soll mittels Hardware gewährleistet werden.
Wenn Du kein Grosssystem entwickelst, wovon wir ausgehen, dann lass mal Performanceüberlegungen aussen vor. Vermutlich kriegst Du doch nicht mehr als eine Transaktion/Sekunde.
Also über Sprache wurde schon häufig diskutiert, zwei Ansätze:
- für jede Sprache n zusätzliche Attribute (title_de, title_en) mit den Vorteilen der Geschwindigkeit, wenn aber eine weitere Sprache hinzukommt wirds ein Horror [2]
Nicht gut.
- Textbausteine in einer Sprachetabelle verwalten ("Wörtertabelle") [4/5] mit den Vorteilen, dass beliebig viele Sprachen einfach hinzugefügt werden können, es muss dabei nichts an der Struktur verändert werden. Zwei Nachteile gibt es hier natürlich auch, der eine wurde erwähnt (Performance & Join-Wars),
"JOIN-Wars"? Da kommen manche wieder zu frühe mit Performance-Überlegungen vermutlich.
den zweiten erwähne ich an dieser Stelle, vielleicht weiss jemand dazu noch Tipps. Es gibt mehrere Arten von Texttypen in den verschiedenen RDBMS, meistens <text> und <varchar(n)>. Wie soll damit umgegangen werden? Die ganze Wortliste als <text> verwalten?
Datentyp text ist so zu sagen eine Ergänzung zum RDBMS, da es ei BLOB ist, beisst sich mit der "Seitenphilosophie" und mit anderem, unbedingt sowas wie VARCHAR() oder CHAR() benutzen.
Zwei Spalten mit den Typen <text> und <varchar(200)>, eines jeweils NULL? Zwei verschiedene Wortlisten mit dem jeweiligen Typ? Und schon versuchen wir wieder das RDBMS nachzubauen (Ich zitiere dich mal: "Grauenhaft" *g*).
Geht es bei der Frage jetzt ums Design der "Wörtertabelle"?
Dazu werde ich mal konkret, es gibt folgende Entitäten: Bücher, Konferenzen, Workshops, Referate, Protokolle, Medienmitteilungen und Autoren, dabei gibt es zwei verschiedene Typen von Verknüpfungen: temporale und logische Beziehungen.
Beispiel für eine temporale Beziehung: Aus Konferenzen können Workshops entstehen und danach darüber ein Buch geschrieben werden.
Hier ist eine wichtige Frage zu beantworten und zwar bzgl. der Eindeutigkeit der Entitäten. Wenn aus Entität A Entität B wird, so ist zu überlegen ob Entität A Entität B soweit entspricht, das Entität C zu bilden ist. Beispiel: Es gibt Vertragsanfragen und Verträge, aus Vertragsanfragen können Verträge werden, nur eine Entität? (In diesem Fall hiess die Antwort (wie so oft) übrigens: Nein. Merkregel: Auf keinen Fall Entitäten "vermanschen", im Zweifel immer neue Entität bilden.)
Die Transformationen (Aus A wird B) kannst Du mit einer sauberen stored procedure (SP) realisieren, scheue Dich nicht vor relativ viel SQL-Code.
Beispiel für eine logische (?) Beziehung: Autoren verfassen jeweils Bücher oder Medienmitteilungen bzw. halten Reden an Konferenzen (Referate).
Du kommst da mit einer Tabelle 'Autoren' und den üblichen foreign keys (FKs), das Attribut heisst z.B. '<Tabellenname>_Owner_ID'.
Weiteres Beispiel für eine logische (= !temporale *g*) Beziehung: An Konferenzen gibt es Referate, über Workshops Protokolle.
Das müsste alles im Rahmen "normaler" Komplexität eines typischen Datendesign sein. Scheue Dich nicht zig FKs einzubauen. Freunde Dich mit etwas komplexeren SQL-Code für SPs an, wähle unbedingt vernünftige Regeln entsprechend Datenfeldnamen, wir nutzen bspw. die Regel "<Tabellenname>_<"eigentlicher Datenfeldname">" für die Datenfeldnamen, Riesenvorteil: DB-weit eindeutige Namen, für FK-Namen die Regel "<Tabellenname>_<"Datenfeldname auf den verwiesen wird">", also bspw. "Bücher_Autoren_ID" für die Autoren ID der Tabelle Bücher. Sehr hilfreich bei den JOINs.
Alle Beziehungen sind n:m!
Nö, glauben wir nicht. Wär die Hölle. (Bei Daten-Historisierung braucht man viele "n:m"s, aber hier?) man Gegenthese: Fast alle sind "1:n" mit folgenden Ausnahmen:
<Liste_unbekannt>
Ziel ist es zum Beispiel bei Büchern in einer Liste die dazugehörigen Elemente aus verschiedenen Entitäten anzugeben. Also Medienmitteilungen, die zum Buch geschrieben wurden, Workshops die zuvor zu diesem Thema durchgeführt wurden etc.
Das geht mit JOINs, da ist erst mal nix "n:m".
Der klassische Ansatz wäre eine Tabelle für jede Entität, diese werden jeweils über m:n Verknüpfungen in seperaten Tabellen referenziert. Schön normalisiert, aber "en huere Tabellesalat" (wie wir Schweizer zu sagen pflegen *g*) (vergleiche "Join-Salat" bei den Sprachen). Und jedesmal eine neue Tabelle für eine neue Beziehung der Entitäten. Und wenn eine neue Entität hinzukommt (zB. Gedichte (nur ein Beispiel!)) mache ich n+1 neue Tabellen...
Du hast halt ein anspruchsvolles Tabellendesign, aber sei beruhigt, es gibt DBs mit 100 bis 200 hübsch verzeigerten Tabellen.
Auch hier zwei Ansätze (lassen wir die Sprache mal weg und ausgehend von dem eingangs erwähnten Schema), entweder alle Attribute in eine Tabelle (mit vielen NULLs) oder der Wörterbuch-Ansatz mit einer Attributtabelle, dann habe ich aber wieder das Typen-Problem und einen join-war (bzw. -salat).
Geplant ist die Entitäten in beiden Ansätzen mittels Views wieder herzustellen.
Weisst Du für sowas sind RDBMSe nicht ausgelegt, Du wirst Riesenprobleme bei komplexen Abfragen bekommen, nach einiger Zeit wird das System vermutlich kaputtgehen.
Das RDBMS stellt Dir doch bereits so eine hübsche ERM-Sicht z.V. und verwaltet den Mist intern ähnlich wie von Dir angestrebt, jetzt willst Du einen Rückbau des Systems?
Also: Entweder alles normalisieren (viele, viele Tabellen vor allem wegen den Beziehungen) oder irgendeine Mischrechnung, wobei ich diese favorisiere aber die optimale noch nicht gefunden habe.
Alles normalisieren bis Tabellenebene, auf Attributebene "intellignet" normalisieren.
Nochmals an alle, vielleicht fällt auch Euch etwas dazu ein? Habt ihr schon Erfahrungen mit sowas gemacht, oder habt ihr einfach auch Lust "das Hirn zu stürmen"?
Ach ja: RDBMS ist ein Microsoft SQL-Server 2003.
MS SQL Server 2005 vermutlich.