Webmaster Forum Logo Part 1 Webmaster Forum Logo Part 2
Webmaster Forum Logo Part 3
     
 
  :: Anmeldung

Benutzername:

Registrierung...

Passwort:

Passwort vergessen?

angemeldet bleiben


  
  :: Umfrage
Welche sozialen Netzwerke benutzt du regelmäßig?

 Facebook
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 73%
 keines
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 22%
 Google+
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 19%
 Twitter
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 11%
 Xing
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 6%
 schülerVZ
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 6%
 meinVZ
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 4%
 studiVZ
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 4%
 MySpace
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 2%
 LinkedIn
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 2%

 ges. 393 Stimmen
 
  :: Buttons

Valid XHTML 1.0 Transitional

Matte

Tripel-As

Dabei seit: 01.01.2009

Beiträge: 154

 

1 Zum Seitenanfang

Montag, 8. August 2011, 15:06

Problem mit Tabellenbeziehung bei Datenbankmodellierung

Hallo liebe Coder,

evtl kann mir jemand helfen meine Beziehungsprobleme zu lösen ;)

Ich hab grob strukturiert drei Tabellen, welche eine DB für Etiketten darstellen soll.


MySQL-Abfrage(n)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CREATE TABLE PRODUKT
(
  PRO_Id                  INT            NOT NULL,
  PRO_Bezeichnung         CHAR(40)       NOT NULL  -- eine alphanumerische Produktbezeichnung
  -- und noch weitere Felder...
)

CREATE TABLE LANGPROD
(
  PRO_Id                  INT           NOT NULL,  
  LAN_Id                  INT           NOT NULL
)

CREATE TABLE LANGUAGE
(
  LAN_Id                  INT            NOT NULL,
  LAN_English             CHAR(40)       NOT NULL
)


Ich denke PRIMARY_KEY und FOREIGN_KEY Beziehungen sollten ersichtlich sein. Jetzt geht es darum, dass eine neue Sprache eingeführt werden soll, Spanisch zum Beispiel, jedoch ist die Beziehung zur PRODUKTLISTE nicht immer gegeben. Was bedeuten soll, Englisch und Spanisch sind in einer eindeutigen Beziehung 1:1 nur Spanisch ist nicht auf jedes Etikett aufgedruckt, sozusagen optional.

Welche Ideen habt ihr?
 

cccpmik

Foren Gott

Dabei seit: 04.09.2007

Beiträge: 2 999

 

2 Zum Seitenanfang

Montag, 8. August 2011, 15:11

tabelle language sollte name und id haben und nicht lang_eng, lang_de usw..

in tabelle lanugage sollte es dann so stehen

id | name
1 | en
2 | de
3 | es

dann brauchste eine bezeichnung zu sprache tabelle und dann verknüpfste bezeichnung mit produkt..
Mein kleines Projekt
-Cruel Online-
 

Tsx

Eroberer

Dabei seit: 10.05.2011

Beiträge: 51

 

3 Zum Seitenanfang

Montag, 8. August 2011, 15:47

Die Antwort meines Vorredners ist quasi alles was du für deine Situation benötigst, wenn du dich jedoch etwas mehr mit dem Thema beschäftigen willst würde ich dir das Themea Datenbank Normalisierung, hier: http://de.wikipedia.org/wiki/Normalisierung_(Datenbank) gut erklärt nahelegen.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Tsx« (8. August 2011, 15:47)

 

Matte

Tripel-As

Dabei seit: 01.01.2009

Beiträge: 154

 

4 Zum Seitenanfang

Montag, 8. August 2011, 16:43

durchaus kenne ich mich da aus und ich hab mein Problem leider nur nicht gut genug ausgeführt.

es gibt für jedes produkt eine art gruppe und für diese Gruppe eine Bezeichnung. Diese Bezeichnung steht fest und hat seine feste Bedeutung in Deutsch, Englisch und anderen Sprachen

dadurch hab ich mir jetz Gedanken gemacht und die Tabelle LANGPROD erweitert. Die Tabelle LANGUAGE in BESCHREIBUNG umgeändert und die Tabelle LANGUAGE so eingeführt wie ihr vorgeschlagen habt. Somit kann ich über die Produkt ID und der Language ID auf die Beschreibung zugreifen.

=>

MySQL-Abfrage(n)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
CREATE TABLE PRODUKT
(
  PRO_Id
  PRO_Bezeichnung
)

LANGUAGE
(
  LAN_Id
  LAN_NAME
)

CREATE TABLE BESCHREIBUNG
(
  BES_Id
  BES_ENG
  BES_DEU
  BES_SPA
  BES_CHI
)

CREATE TABLE PRODLANGBESCHR
(
  PRO_Id  
  LAN_Id
  BES_Id 
)


in LAN_Name muss jetz sowas wie BES_ENG oder BES_DEU drin stehen damit ich auf das richtige Feld in der Tabelle BESCHREIBUNG zu greifen kann. oder gibt es eine bessere Lösung?
 

cccpmik

Foren Gott

Dabei seit: 04.09.2007

Beiträge: 2 999

 

5 Zum Seitenanfang

Montag, 8. August 2011, 16:52

tabelle Produkt
id | name | weitere felder
1 | mein tolles produkt| sonstige sachen



tabelle beschreibungen
id | beschreibung | produkt_id | sprache
1 | was tolles | 1 | de
2 | something cool | 1 | en
3 | чтото крутое | 1 | ru


das wäre die simpelste lösung
Mein kleines Projekt
-Cruel Online-
 

Matte

Tripel-As

Dabei seit: 01.01.2009

Beiträge: 154

 

6 Zum Seitenanfang

Montag, 8. August 2011, 19:22

sorry cccpmik, aber deine tabellen lösen mein problem nicht und wenn ich die zuweisungstabelle hinzufügen würde, hab ich wieder die nicht erwünschte redundanz in der tabelle beschreibung.
 

cccpmik

Foren Gott

Dabei seit: 04.09.2007

Beiträge: 2 999

 

7 Zum Seitenanfang

Montag, 8. August 2011, 21:21

eben doch.. du willst zu jedem produkt(1) mehrere beschreibungen (n) und diese beschreibung gibt es in einer sprache 1 mal.


schauen wir mal was du hier getan hast

Quellcode

1
2
3
4
5
6
7
8
CREATE TABLE BESCHREIBUNG
(
  BES_Id
  BES_ENG
  BES_DEU
  BES_SPA
  BES_CHI
)


beschreibung id und jede beschreibung in einer klasse als spaltenüberschrift? gaanz schlecht, irgendwann kommen weitere sprachen dazu und jedesmal eine weitere spalte hinzufügen?

LANGUAGE
(
LAN_Id
LAN_NAME
)

wozu brauchste eine sprach id und einen sprachnamen wenn du schon vorher eine beschreibung in der sprache hast?

CREATE TABLE PRODLANGBESCHR
(
PRO_Id
LAN_Id
BES_Id
)

ist so ziemlich das gleiche wie meine lösung mit
id | beschreibung | produkt_id | sprache
1 | was tolles | 1 | de
2 | something cool | 1 | en
3 | чтото крутое | 1 | ru

nur fand ich es sinnlos dafür extra tabellen anlegen un dann später joins über 3 tabellen zu machen.

nun zu meiner lösung. du willst in allen sprachen zur produkt id 1 eine beschreibung erhalten?

MySQL-Abfrage(n)

1
2
3
SELECT p.id as produkt_id,p.name as produkt_name,d.sprache as sprache, d.beschreibung as beschreibung
FROM products p INNER JOIN descriptions d ON(p.id = d.produkt_id)
WHERE p.produkt_id =1


oder du willst lieber vom produkt eine beschreibung in einer ausgewählten sprache?

MySQL-Abfrage(n)

1
2
3
4
SELECT p.id as produkt_id,p.name as produkt_name,d.sprache as sprache, d.beschreibung as beschreibung
FROM products p INNER JOIN descriptions d ON(p.id = d.produkt_id)
WHERE p.produkt_id =1 
AND p.sprache = 'en'


oder willst du verfübare sprachen sehen?

MySQL-Abfrage(n)

1
2
SELECT DISTINCT sprache
FROM  descriptions


wenn du eine weitere sprache in einer beschreibung zu einem produkt hinzufügst, dann brauchste nur was in eine tabelle einzutragen und fertig du brauchst keine sprache anzulegen und dann eine bezeichnung unabhängig von sprache und dann das ganze noch verknüpfen..

so wenn ich immernoch falsch liege, dann möchte ich doch bitte deine beispiel daten haben um zu sehen was du für werte hast und wie könnte man die am besten auf tabellen verteilen.. einfach mal normalisierung machen von 1 bis 3, dann sehen wir weiter
Mein kleines Projekt
-Cruel Online-
 

Matte

Tripel-As

Dabei seit: 01.01.2009

Beiträge: 154

 

8 Zum Seitenanfang

Dienstag, 9. August 2011, 08:55

bei dir schaut deine beschreibung tabelle so aus, nicht?

id | beschreibung | produkt_id | sprache
1 | was tolles | 1 | de
2 | something cool | 1 | en
3 | чтото крутое | 1 | ru
4 | was schlechtes | 2 | de
5 | something bad | 2 | en
6 | чтото ... | 2 | ru
7 | etwas normales | 3 | de

usw.. nicht?

Bei riesigen Datensätzen kommt eine riesige Tabelle raus und tatsächlich ist es so, dass wenn eine neue Sprache eingeführt wird, jeder Begriff neu übersetzt werden muss. Somit ist auf eine einfache Übersetzungstabelle leichter zu zu greifen, als auf eine mixed tabelle wie in diesem Fall. In meinem Fall legt man eine neue Spalte an, gibt all seine Vokabeln zu einer beschriebenen Spalte an, legt die neue Sprache in der Sprachtabelle an und fertig ggf in umgekehrter Reihenfolge. Bei dir muss man zu jeder x. (je nach Anzahl der vorhandenen Sprachen) existierenden Zeile eine Neue hinzufügen, eine neue id vergeben und einen neuen sprachkürzel erfinden und eingeben, welcher bei etwas pech mal einen schreibfehler drin hat und schon existiert eine neue sprache.

Lieber mach ich in der SQL Abfrage welche ich geschrieben hab den ein oder anderen Join mehr, als dass ich das Einfügen neuer Obejekte von Fremden unsicher gestalte.
 

cccpmik

Foren Gott

Dabei seit: 04.09.2007

Beiträge: 2 999

 

9 Zum Seitenanfang

Dienstag, 9. August 2011, 09:59

Bei riesigen Datensätzen kommt eine riesige Tabelle raus und tatsächlich ist es so, dass wenn eine neue Sprache eingeführt wird, jeder Begriff neu übersetzt werden muss.

nein muss er nicht . du trägst was in english ein und was in deutsch für produkt 1 und bei produkt 2 kannst du einfach was in spanisch eintragen, dann hat das produkt 2 einfach keine deutsche oder englishe übersetzung.


Bei dir muss man zu jeder x. (je nach Anzahl der vorhandenen Sprachen) existierenden Zeile eine Neue hinzufügen,

nein es ist dir frei überlassen, man muss es nicht

eine neue id vergeben und einen neuen sprachkürzel erfinden und eingeben, welcher bei etwas pech mal einen schreibfehler drin hat und schon existiert eine neue sprache.

eine id ist auto increment(normalerweise) so dass bei einem insert into du es nicht mal angeben muss. und diese sprachkürzel, die muss man nicht erfinden, diese bezeichnung sind ein ISO 639-1 Standard http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes


Lieber mach ich in der SQL Abfrage welche ich geschrieben hab den ein oder anderen Join mehr, als dass ich das Einfügen neuer Obejekte von Fremden unsicher gestalte.

wieso unsicher? auch bei dir musst du deine eingaben vor dem insert validieren. (außerdem gibt da so ein Trick im PHP my Admin, beim anlegen eines feldes definierst du es als ENUM und schreibst in das eingabefeld für Länge 'de'.'en'.'es'.'ru'.'was anderes' und bei default setzt du 'de', danach kann nichts anderes mehr in die spalte eingetragen werden außer diese werte, und wenn nichts eingetragen wurde, wird de als default übernommen). Bei einer INNOBD engine haste sogar die möglichkeit, dass deine beschreibungen nicht gelöscht werden, wenn ein Produkt noch exestiert. und wenn das Produkt gelöscht wird, werden auch die beschreibungen zu dem Produkt gelöscht(automatisch ON DELETE CASCADE)

naja meine Aufgabe es dir ein Tipp zu geben;) was du damit machst ist deine sache.

MFG
Mein kleines Projekt
-Cruel Online-

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »cccpmik« (9. August 2011, 09:59)

 

Matte

Tripel-As

Dabei seit: 01.01.2009

Beiträge: 154

 

10 Zum Seitenanfang

Dienstag, 9. August 2011, 10:12

Bei riesigen Datensätzen kommt eine riesige Tabelle raus und tatsächlich ist es so, dass wenn eine neue Sprache eingeführt wird, jeder Begriff neu übersetzt werden muss.

nein muss er nicht . du trägst was in english ein und was in deutsch für produkt 1 und bei produkt 2 kannst du einfach was in spanisch eintragen, dann hat das produkt 2 einfach keine deutsche oder englishe übersetzung.


Bei dir muss man zu jeder x. (je nach Anzahl der vorhandenen Sprachen) existierenden Zeile eine Neue hinzufügen,

nein es ist dir frei überlassen, man muss es nicht


Doch muss man :) Anforderungen an das System ist, dass wenn eine neue Sprache eingeführt wird, auch jedes Produktname übersetzt werden muss. Sonst muss ich ja in dem Fall dass ich ein Produkt nach Asien verkaufen will, aber die Übersetzung für dieses Land leider noch nicht vorhanden ist, die Bezeichnung neu anlegen. Wie soll ich das einen Laien und dieser Sprache Nichtmächtigen verständlich machen?
Sorry dein Produkt gibts zwar aber ich hab leider keine Ahnung wie des auf Chinesisch heißt. Frag doch "irgendeinen" Dolmetscher der dir die Schriftzeichen zu schickt und dann in die DB einträgt bevor du weiter machst.
 

cccpmik

Foren Gott

Dabei seit: 04.09.2007

Beiträge: 2 999

 

11 Zum Seitenanfang

Dienstag, 9. August 2011, 10:28

ok angenommen du hast nun in deiner datenbank sagen wir mal 1000 Produkte. Nun kommt eine weitere sprache hinzu, sagen wir mal chinesisch. was müsstest du dann machen wie in deinem beispiel beschrieben?
1)
in Tabelle Lanugage einen neuen Insert into machen. für lang_id und lang_name

2)
Tabelle beschreiubung eine weiter spalte anlegen

3)
weitere zeile in produktlangbeschreibung erstellen

4)
in Tabelle beschreibung dann in allen zeilen den text der neuen sprache eintragen

bei meinem beispiel müsstest du
1)
in der tabelle beschreibungen den wert des ENUMS in der spalte LANG editieren
2)
neue Texte eintragen für das Produkt, produkt_id aus der dropdown liste auswählen, sprache aus der dropdown liste auswählen(im php my admin)

es ist nicht weniger aufwändig neue texte einzufügen, in beiden fällen ist das ein gefrickel, jedoch ist die validierung und kontrolle in meinem fall einfacher.
aber wie gesagt, ich habe mein senf dazu gegeben;) nun ist es an dir es anzunehmen oder zu ignorieren;)

vielleicht hat ja jemand anderes hier eine bessere lösung
Mein kleines Projekt
-Cruel Online-
 

Ego

Routinier

Dabei seit: 22.07.2009

Beiträge: 322

 

12 Zum Seitenanfang

Dienstag, 9. August 2011, 22:36

sorry cccpmik, aber deine tabellen lösen mein problem nicht und wenn ich die zuweisungstabelle hinzufügen würde, hab ich wieder die nicht erwünschte redundanz in der tabelle beschreibung.

welche Redundanz?

sonst muss ich sagen das ich gestern schon Die Lösung von cccpmik intuitiver oder allgemein besser fand.
  • da wüsste ich auf Anhieb wie die SQL-Abfragen aussehen müssten - bei Dir müsste ich erstmal überlegen wie man das geschickt abfragt
  • beim hinzufügen von neuen Sprachen muss man keine Tabellen alterieren - nur Werte in den Tabellen hinzufügen

Gruß
ego