Поле 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
лучший подход для реляционных баз данных заключается в следующем :
один стол для coutries, скажем country_id, country_desc (country_id является основным)
одна таблица для продуктов, скажем product_id, product_desc и столько столбцов, сколько вы хотите (product_id первично)
Если бы у вас была только одна страна, было бы достаточно иметь внешний ключ, указывающий на country_id в каждой строке продукта. Наличие внешнего ключа утверждает, что существует фактический country behing a country_id со ссылкой на таблицу стран.
в вашем случае у вас есть несколько стран для продукта, чтобы добавить отдельную таблицу ассоциации product_id, country_id
оба ключа первичные и оба внешних, а также.