2013-10-24 5 views
0

Создание пользовательской системы CRM Я столкнулся с стеной, выясняя правильный способ компоновки MySQL. Система должна быть динамичной, т.е. расширяемый для нескольких новых продуктов с течением времени. Каждый продукт должен иметь индивидуальный биллинг, и каждый контакт должен иметь несколько продуктов.Правильный макет базы данных MySQL

Должен ли я использовать таблицы, как это:

Contacts{ ID } 
Product_1{ ID; FK_ID; +Custom columns} 
Product_2{ ID; FK_ID; +Custom columns} 
Product_3{ ID; FK_ID; +Custom columns} 
+ 15 more products (Expanding) 

Или я должен использовать что-то вроде этого:

Contacts{ ID } 
Products{ ID; FK_ID; +100 other columns (expanding)} 

Первый пример будет легко настроить, но будет содержать много таблиц более время. Также для связывания контактов с продуктами потребуется другая таблица.

Последний пример будет проще настраивать в PHP, но будет беспорядок, смотрящий на таблицу.

Любые другие идеи? Что из них быстрее? Что является наиболее «общим»?

У меня такое ощущение, что ни одно из этих решений не оптимально, должен быть лучший способ?

+1

Зачем вам нужны разные столбцы для каждого продукта? Ни один из предложенных вами вариантов не выглядит хорошо. Вы должны попытаться сделать вещи более универсальными, обнаружив сходство между всеми различными продуктами.Вы, возможно, все же получите несколько разных таблиц и столбцов (например, для разных типов продуктов), но это все равно будет улучшением. – acfrancis

+0

Продукты имеют очень мало общего, так что это действительно невозможно. – Jeppe

ответ

1

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

Product_1{ Product_ID (PK); +Custom columns} 
Product_2{ Product_ID (PK); +Custom columns} 
... 

Теперь возьмите это шаг Furt ее с этими таблицами:

Product {ID (PK auto increment); Contact_ID (FK), Type_ID (FK)} 
Product_Type {Type_ID (PK); Type_Name} 

Вставка столько строк в product_type, как у вас есть таблицы пользовательских продуктов (Product_1, Product_2 и т.д.). Каждый раз, когда вы создаете новую конкретную таблицу продуктов, добавьте строку в таблицу Product_Type.

Также введите Product_n.Product_ID внешний ключ (и НЕ автоинкремент) до Product.ID.

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

Если вы хотите, чтобы сделать его полностью пуленепробиваемым, вы можете добавить Type_ID столбец каждой таблицы Product_n, включить его в ПК (наряду с Product_n.Product_ID) и добавить проверочное ограничение такое, что Product_1.Type_ID == 1, Product_2.Type_ID == 2 и так. Это гарантирует, что вы не можете испортить отношения между Product и Product_n, даже если попробуете, но, честно говоря, я думаю, что это слишком много, и у меня не было проблем с «непункерной» версией.

+0

Это очень похоже на идею, которую мы изучаем. Теперь, если у меня только был Contact.ID клиента и вы хотели выбрать все продукты, связанные с этим клиентом, как вы предлагаете это сделать? Вы бы выбрали все Product_Type.Type_Name и создали команду sql innerjoin, содержащую все разные таблицы продуктов, а затем сортировку по Contact_ID = идентификатор, из которого мне нужны продукты? Это основано на Product_Type.Type_Name, в котором указано имя таблицы для каждого продукта, и я думаю, это была идея? – Jeppe

+0

Учитывая, что каждый контакт должен иметь несколько версий каждого продукта, я думаю, у меня должен быть уникальный идентификатор, а не внешний ключ Product.ID? Или, может быть, оба? – Jeppe

+0

Если вам нужно знать, какие продукты имеют контакты (другими словами, какие идентификаторы продуктов), используйте таблицу '' Product''. Если вам нужно знать детали каждого продукта, вам нужно будет присоединиться к соответствующему '' Product_n'', но я думаю, что маловероятно, чтобы вы на самом деле делали это в одном запросе. Как ваше приложение отобразит всю эту информацию? – acfrancis

1

Вы могли бы рассмотреть третью таблицу для хранения динамической «особенности»:

Contacts{ Id; } 
Products{ Id; } 
ProductFeature{ Id; ProductId; FeatureName, FeatureValue } 

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

+0

Мета-таблицы, как правило, являются плохими идеями в конечном итоге. Каждый «FeatureValue» должен быть varchar или что-то подобное, и приложение должно будет неявно знать, какой тип каждой отдельной функции на самом деле. Это только начало ваших проблем. Не делай этого. – acfrancis

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