Поле SQL с несколькими идентификаторами другой таблицы

может кто-нибудь дать мне идею, как создать эту структуру базы данных. Вот пример:

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

теперь у меня есть еще одна таблица "продукты", и там я хотел бы хранить все страны, где этот продукт доступен:

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.

мой вопрос: Как я могу спроектировать структуру таблицы в "продуктах", чтобы иметь возможность хранить несколько стран?

моя лучшая идея-поместить туда строку, разделенную запятыми (т. е. "1,2,4"), а затем разделить эту строку, чтобы посмотреть вверх по каждой записи. Но я сомневаюсь, что это лучший способ сделать это?

EDIT: спасибо всем за вашу помощь, удивительно! Трудно было выбрать правильный ответ., Я, наконец, выбрал Грега, потому что он указал мне на объяснение соединения и дал пример, как его использовать.

5 ответов


для этого вам нужна таблица пересечений многие-ко-многим отношения.

Table Country
CountryID, CountryName

Table CountryProduct
CountryID, ProductID

Table Product
ProductID, ProductName

вы тогда Внутреннее Соединение все 3 таблицы, чтобы получить список стран и продуктов.

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

без денормализации вам нужно добавить дополнительную таблицу

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

то, о чем вы говорите, - это нормализация. У вас есть структура "многие ко многим", поэтому вы должны создать другую таблицу, чтобы связать их. Вы никогда не должны (ОК, почти никогда) использовать разделенные строки для хранения списка значений в реляционной базе данных.

вот пример настройки:

product_countries table

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

Вы можете использовать внешний ключ для каждой таблицы, а затем сделать их как в составной первичный ключ.

Вы можете получить список поддерживаемых продуктов для страна ID, как это:

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

вы также можете сделать третью таблицу countries_products с полями country_id и product_id.


лучший подход для реляционных баз данных заключается в следующем :

один стол для coutries, скажем country_id, country_desc (country_id является основным)

одна таблица для продуктов, скажем product_id, product_desc и столько столбцов, сколько вы хотите (product_id первично)

Если бы у вас была только одна страна, было бы достаточно иметь внешний ключ, указывающий на country_id в каждой строке продукта. Наличие внешнего ключа утверждает, что существует фактический country behing a country_id со ссылкой на таблицу стран.

в вашем случае у вас есть несколько стран для продукта, чтобы добавить отдельную таблицу ассоциации product_id, country_id

оба ключа первичные и оба внешних, а также.