12 Stimmen

SQL-Feld mit mehreren Id's einer anderen Tabelle

Könnte mir jemand eine Idee geben, wie ich diese Datenbankstruktur erstellen kann? Hier ist ein Beispiel:

Table "countries":
id, countryname
1, "US"
2, "DE"
3, "FR"
4, "IT"

Nun habe ich eine weitere Tabelle "Produkte", in der ich alle Länder, in denen dieses Produkt erhältlich ist, speichern möchte:

Table "products":
id,productname,countries
1,"product1",(1,2,4) // available in countries US, DE, IT.
2,"product2",(2,3,4) // available in countries DE, FR, IT.

Meine Frage: Wie gestalte ich die Tabellenstruktur in "Produkte", damit ich mehrere Länder speichern kann?

Meine beste Idee ist es, eine kommagetrennte Zeichenfolge dort einzugeben (z. B. "1,2,4"), und diese Zeichenfolge dann aufzuteilen, um jeden Eintrag zu suchen. Aber ich bezweifle, dass dies der beste Weg, dies zu tun?

EDIT: Vielen Dank an alle für eure Hilfe, toll! Es war schwierig, die richtige Antwort zu finden, Ich habe mich schließlich für Gregs entschieden, weil er mich auf eine JOIN-Erklärung hingewiesen und ein Beispiel für die Verwendung gegeben hat.

12voto

Greg Punkte 8354

Dazu benötigen Sie eine Kreuzungstabelle many-to-many Beziehung.

Table Country
CountryID, CountryName

Table CountryProduct
CountryID, ProductID

Table Product
ProductID, ProductName

Sie dann Innere Verbindung alle 3 Tabellen, um Ihre Liste der Länder und Produkte zu erhalten.

Select * From Country 
Inner Join CountryProduct On Country.CountryID = CountryProduct.CountryID 
Inner Join Product On CountryProduct.ProductID = Product.ProductID

3voto

vc 74 Punkte 36002

Ohne Denormalisierung müssen Sie eine zusätzliche Tabelle hinzufügen

Table Product countries
ProductID CountryID
1         1
1         2
1         4...

3voto

Polynomial Punkte 26610

Was Sie meinen, ist Normalisierung. Sie haben eine Many-to-many-Struktur, also sollten Sie eine weitere Tabelle erstellen, um die beiden zu verbinden. Sie sollten niemals (ok, so gut wie niemals) durch Trennzeichen getrennte Zeichenfolgen verwenden, um eine Liste von Werten in einer relationalen Datenbank zu speichern.

Hier ist ein Beispiel für den Aufbau:

product_countries table

productid | countryid
----------+-----------
1         | 1
1         | 2
1         | 4
2         | 2
2         | 3
2         | 4

Sie können einen Fremdschlüssel zu jeder anderen Tabelle verwenden und dann beide zu einem zusammengesetzten Primärschlüssel machen.

Sie können dann eine Liste der unterstützten Produkte für eine Länderkennung wie diese erhalten:

SELECT * FROM products, product_countries
WHERE products.id = product_countries.productid
AND product_countries.countryid = $cid

1voto

Avo Muromägi Punkte 1533

Sie könnten auch eine dritte Tabelle countries_products mit den Feldern country_id und product_id erstellen.

1voto

BuZz Punkte 15178

Der beste Ansatz für relationale Datenbanken ist der folgende:

Eine Tabelle für Länder, sagen wir country_id, country_desc (country_id ist primär)

eine Tabelle für Produkte, z.B. product_id, product_desc und so viele Spalten wie gewünscht (product_id ist primär)

Wenn Sie nur ein einziges Land hätten, würde es ausreichen, in jeder Produktzeile einen Fremdschlüssel zu haben, der auf country_id verweist. Mit einem Fremdschlüssel wird sichergestellt, dass sich hinter einer country_id, die auf die Ländertabelle verweist, ein tatsächliches Land befindet.

In Ihrem Fall haben Sie mehrere Länder für ein Produkt, also fügen Sie eine separate Zuordnungstabelle hinzu produkt_id, land_id

beide Primärschlüssel und beide Fremdschlüssel.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X