2013-10-24 34 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_1Product_2等)。每次创建新的特定产品表时,请在Product_Type表中添加一行。

还使Product_n.Product_ID一个外键(而不是自动增量)到Product.ID

这样,您可以通过Product表或通过正确的Product_n表一般引用任何类型的产品。你甚至可以通过查看Product.Type_ID来判断它是什么类型的产品。

如果你想使之完全防弹,可以在Type_ID列添加到每个Product_n表,包括它在PK(与Product_n.Product_ID沿),并添加一个检查约束,使得Product_1.Type_ID == 1Product_2.Type_ID == 2等。这样可以确保你不会搞砸ProductProduct_n之间的关系,即使你尝试了,但说实话,我认为它是过度杀伤性的,我没有遇到过“非防弹”版本的问题。

+0

这听起来很像我们探索的想法。 现在,如果我只有一个客户的Contact.ID,并且想要选择与此客户相关的所有产品,那么您如何建议实现这一目标? 您是否会选择所有Product_Type.Type_Name并创建一个包含所有不同产品表的sql innerjoin命令,然后通过Contact_ID =我需要产品的ID进行排序? 这是基于Product_Type.Type_Name包含每个产品的表名称,我想这是主意? – Jeppe

+0

考虑到我希望每个联系人都能够拥有多个版本的每个产品,我想我应该有一个唯一的ID而不是Product.ID的外键?或者两者兼得? – Jeppe

+0

如果您需要知道联系人拥有哪些产品(换句话说,哪些产品ID),请使用“Product”表。如果您需要了解每种产品的详细信息,则需要加入相关的''Product_n'',但我认为您不可能在单个查询中真正做到这一点。你的应用程序将如何显示所有这些信息? – acfrancis

1

你可以考虑引入第三表来存储动态“特点”:

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

这并使其更复杂的查询,但不需要为每一个新产品的模式改变的优势或功能

+0

从长远来看,这样的元表通常是一个坏主意。每个“FeatureValue”必须是varchar或类似的东西,应用程序必须隐式知道每个单独功能的实际类型。这只是你问题的开始。不要这样做。 – acfrancis