Поле SQL с несколькими идентификаторами другой таблицы - PullRequest
7 голосов
/ 09 ноября 2011

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

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"), а затем разбить эту строку, чтобы найти каждую запись. Но я сомневаюсь, что это лучший способ сделать это?

РЕДАКТИРОВАТЬ: Спасибо всем за помощь, потрясающе! Трудно было выбрать правильный ответ, Я наконец выбрал Грегса, потому что он указал мне на объяснение JOIN и дал пример, как его использовать.

Ответы [ 5 ]

10 голосов
/ 09 ноября 2011

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

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
2 голосов
/ 09 ноября 2011

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

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

product_countries table

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

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

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

SELECT * FROM products, product_countries
WHERE products.id = product_countries.productid
AND product_countries.countryid = $cid
2 голосов
/ 09 ноября 2011

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

Table Product countries
ProductID CountryID
1         1
1         2
1         4...
1 голос
/ 09 ноября 2011

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

Одна таблица для стран, скажем, country_id, country_desc (country_id является первичной)

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

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

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

оба ключа первичные и оба чужие.

1 голос
/ 09 ноября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...