Я бы предположил, что это будет простой ответ для тех, кто разработал множество схем баз данных, но недавно мне было поручено оптимизировать (или пытаться оптимизировать) схему базы данных и были прочитав «Высокопроизводительный MySQL», и я оставил вопрос относительно использования или «чрезмерного использования» отношений внешних ключей в рамках схемы. Например позволяет сказать, что у меня есть следующие таблицы:Отношения первичного/внешнего ключа данных
CUSTOMERS:
__________________________________
|CustIDPK| Name | RegDate |
----------------------------------
| 1 | frank | 01-30-2014 |
| 2 | terry | 02-01-2014 |
| 3 | amber | 02-02-2014 |
| 4 | sara | 02-06-2014 |
PRODUCTS:
____________________________________
| ProdIDPK | ProdName | AddedDate |
------------------------------------
| 1 | Phone | 01-01-2014 |
| 2 | TV | 01-02-2014 |
| 3 | Tablet | 01-02-2014 |
| 4 | PC | 01-05-2014 |
PRODUCT_RATINGS:
__________________________________________________________________
| ProdRateIDPK | ProdIDFK | CustID | Rating | TimeRated |
------------------------------------------------------------------
| 1 | 1 | 1 | 8 | 01-01-2014 |
| 2 | 1 | 2 | 7 | 01-01-2014 |
| 3 | 1 | 3 | 8 | 01-02-2014 |
| 4 | 2 | 4 | 6 | 01-02-2014 |
| 5 | 2 | 4 | 6 | 01-03-2014 |
| 6 | 2 | 3 | 4 | 01-01-2014 |
| 7 | 3 | 2 | 5 | 01-02-2014 |
| 8 | 3 | 1 | 7 | 01-03-2014 |
| 9 | 3 | 1 | 4 | 01-04-2014 |
| 10 | 4 | 2 | 9 | 01-04-2014 |
| 11 | 4 | 3 | 8 | 01-01-2014 |
| 12 | 4 | 4 | 7 | 01-01-2014 |
Таблица КЛИЕНТЫ существует независимо от таблицы PRODUCTS поэтому никаких отношений не определенно. Таблица PRODUCT имеет отношение «один ко многим» к таблице PRODUCT_RATINGS, так как любой продукт может иметь много рейтингов. Это ясно.
Теперь в существующей схеме в таблице PRODUCT_RATINGS столбец CustID является внешним ключом таблицы CUSTOMERS, представляющей отношения «один ко многим» с рейтингами продукта, поскольку любой пользователь может иметь много оценок в этой таблице (каждый рейтинг, представляющий собой отдельный продукт).
Мой вопрос: Если столбец «CustID» определяется как внешний ключ, создающий отношения «один ко многим» с таблицей CUSTOMERS? Я не вижу необходимости в необходимости объединения этих данных. Из того, что я могу сказать, столбец «CustID» используется только в заявке, чтобы отличить, какой клиент выдал рейтинг ...
Обратите внимание, что ProdRateIDPK является избыточным в этой схеме - на основе того, что у вас есть вполне адекватный PK (prodid, cust) или (prodid, custid, timerated) – Strawberry
Любые две таблицы могут быть объединены. Наличие FK между ними просто означает, что соединение будет иметь одну строку результата для каждой строки таблицы ссылок. Просто объявляйте все ключи-кандидаты (т. Е. Минимальные столбцы PK/UNIQUE, т.е. наборы столбцов, которые не содержат более мелких) и FKs. (SQL требует, чтобы вы объявляли наборы столбцов PK/UNIQUE, на которые ссылаются в FK.Также вы также должны объявлять те нестандартные столбцы PK/UNIQUE и соответствующие FK, которые, следовательно, являются фактически чужими суперклассами.) – philipxy