2014-02-08 5 views
0

Я бы предположил, что это будет простой ответ для тех, кто разработал множество схем баз данных, но недавно мне было поручено оптимизировать (или пытаться оптимизировать) схему базы данных и были прочитав «Высокопроизводительный 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» используется только в заявке, чтобы отличить, какой клиент выдал рейтинг ...

+0

Обратите внимание, что ProdRateIDPK является избыточным в этой схеме - на основе того, что у вас есть вполне адекватный PK (prodid, cust) или (prodid, custid, timerated) – Strawberry

+0

Любые две таблицы могут быть объединены. Наличие FK между ними просто означает, что соединение будет иметь одну строку результата для каждой строки таблицы ссылок. Просто объявляйте все ключи-кандидаты (т. Е. Минимальные столбцы PK/UNIQUE, т.е. наборы столбцов, которые не содержат более мелких) и FKs. (SQL требует, чтобы вы объявляли наборы столбцов PK/UNIQUE, на которые ссылаются в FK.Также вы также должны объявлять те нестандартные столбцы PK/UNIQUE и соответствующие FK, которые, следовательно, являются фактически чужими суперклассами.) – philipxy

ответ

1

Я не знаком с этой проблемой, что вы упомянули: «чрезмерное использование» иностранных ключевые отношения внутри схемы ". Как правило, проблема недоиспользована.

Определение отношения внешнего ключа делает несколько вещей. Самое главное, это гарантирует, что столбец CustId в таблице PRODUCT_RATING s является действительным CustId в таблице CUSTOMERS. Это очень полезно.

Есть последствия для этого, но уточнение, что эта связь существует, является частью хорошего дизайна схемы. Это не то, что нужно удалить необычным понятием «оптимизация».

+0

Я думаю, что это я за цикл был, когда они начали говорить о нормализации и денормализации для ваших конкретных потребностей и начали думать, что если соединение не происходит, то столбец CustID не нужно индексировать в качестве внешнего ключа в таблице PRODUCT_RATINGs. Я понимаю, что вы имеете в виду, гарантируя, что CustID действителен. Серьезные проблемы могут возникнуть, если клиент удален, но все еще существуют несвязанные данные. – commanderZiltoid

0

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

Смежные вопросы