2011-07-29 158 views
2

我正在为我的第一个项目设置数据库中的表。 (Exciting!)MySQL数据库设计:一对一,多对多,多对一还是太多?

我很难决定我需要建立什么类型的关系。

我有以下基本表计划。

products 
----- 
id 
product_name 
product_details 
product_url 
product_img 
category_id 
business_id 


categories 
----- 
id 
category_name 
category_description 
category_slug 


businesses 
---------------- 
id 
business_name 
business_phone 
business_address 
business_city 
state_id 
business_zip 

state 
----- 
id 
state_name 

我被卡住的地方在于决定建立什么类型的关系。

每个产品只能属于 1个类别,只能属于1个业务

对于业务表我想知道如果它是一个更好的主意打出来的城市邮政编码分成不同的表格。

我希望能够通过类别和城市, 例如检索产品:在“洛杉矶”鞋',或者只是“鞋”或全部产品在“洛杉矶”

任何人都可以提供一些见解或分享他们的经验。由于我正在准备设置我的表格,所以我宁愿制定出现在这些情景,然后通过开发的一半。

回答

3

您的设计是好的 - 它很干净。我无法在任何地方看到多对多的东西 - 它似乎是一个平直的层次结构。

此外,你的思考过程似乎很清晰 - 不断问自己这些问题,你会没事的。

不过,我有以下建议:

首先,总是在命名奇异,businessbusinesses您的表。

其次,尽量避免前缀表名的列名,因此name,不business_name - 当你在查询中引用它,这是无论如何显而易见的:business.name(在business.business_name额外business_是多余的)

而且,因为拉链是在一个城市,和城市的状态,储存城市和国家的业务是冗余数据,所以你应该这样做:

business 
---------------- 
id 
name 
phone 
address 
zip_code_id 

zip_code 
-------- 
id 
city_id 
name 

city 
---- 
id 
state_id 
name 

state 
----- 
id 
name 

回答您的问题重新查询,你可以得到什么你需要这个模式。除非你真的有麻烦,否则我不会在这里发布它,但是它们是非常简单的查询,所以我会留给你解决。

+0

非常感谢您的帮助和建议,特别是关于不在列名前加字的问题,它非常简洁。再次感谢。 – 404error

-1

你应该权衡优点和缺点。

有了多对多的关系,如果你正常化,那么你最终会得到更多的表,并且需要更多的连接。如果您必须经常检索这些记录,那么连接将非常昂贵并且会增加很多开销。

如果您决定将东西放入一个大表中,那么您将增加数据冗余,这会浪费存储空间,但如果由于更好的索引使用并且没有联接而总是查询该列组合,则值得。但它增加了应用程序开发的复杂性特别是当您在非规范化时在不同表中具有相同的列时,最终必须记住更新这两个表,这会增加数据不一致的风险,如果您忘记更新其中任何一个表。

总之

所以这真的取决于你的情况,如果性能与特点是关键,你不介意增加复杂性和可能的​​数据完整性问题,然后拿上一个非规范化的做法。如果性能不是一个大问题(不是很多行,不是很多用户,绰绰有余的硬件,速度并不关心),那么分离关系表将会减少存储空间(自从如此便宜),增加数据完整性,减少数据不一致性并降低开发复杂性。

+0

感谢您的回复。复杂性不是我现在需要的,谢谢。 – 404error