2013-01-23 27 views
3

我想了解多对多的关系,但我的头一直在打破我的这个爱好项目:SQL规范化,多对多3个固定值?

在一个游戏数据库中,我目前有一个包含所有列和值的表。

GAMES 
id name alt_name1 alt_name2 type    length group_size 
---------------------------------------------------------------------------- 
1 foo foozoo  NULL  ice, team, silly s, m  s, l, xl 

然而,实现搜索的时候,我遇到问题,专门为愚蠢游戏中等长度为看时就来了。

据我了解,为了规范我将创建一个新表name(一个ID最多三个名字)。 typelengthgroup_size许多一对多的关系,所以我需要为他们创造价值和表格表他们的关系保持到游戏:

type 
games_type 
length 
games_length 
group_size 
games_group_size 

难道还有比创建一个更美好的方式这些表格?

感谢您的想法!

+2

表格保持与游戏的关系通常被称为* junction *表。是的,这是实现多对多的正确方法。不要让这个表有许多行会欺骗你:SQL数据库可以很好地处理数百万行。另请阅读:http://stackoverflow.com/questions/3653462/is-storing-a-delimited-list-in-a-database-column-really-that-bad – NullUserException

+0

感谢您的保证!我更担心我创建了2个表来处理只有3个值'''''',''''xl'(如果是'group_size')。不确定是否将联系表中的关系“外部化”是值得的。 –

回答

3

你有一个多对多的关系任何时候,你应该有一个包含不同的值,那么关联两个(结表)另一个表2个表。

在包含非关联记录的表,所有其他列应说明唯一主键的属性。如果描述性值可能在表中出现多次,它应该可能有自己的表(查找表)。

例如:

Items_A 
id,name 

Items_B 
id,name 

A_with_B 
item_a_id,item_b_id 

一个常见的用法是用户和用户组这将是这样的:

Users 
id,name 

Groups 
id,name 

Group_Users 
user_id,group_id 

如果要扩展这个例子,包括你可以有一些查找表这样(其中用户可以仅是在一个位置,而是可以属于多个组)

Users 
id,name,location_id 

Locations 
id,name 

Groups 
id,name 

Group_Users 
user_id,group_id 
+0

谢谢你的例子。至于我的问题是否有更好的方法,你的回答是否定的? –

+0

@ChristianMacht我相信你想要做的是正确的。我提供了可供参考的例子,以便您能理解推理。 – Ethan

+2

@ChristianMacht创建所有这些表格是更好的方法。我可以理解你还没有看到它,但是如果你尝试了一种不同的方法,你会纠结于你想要做的事情。 –

1

这是正确的,你使用的是games_typegames_lengthgames_group_size表有效分解许多一对多的关系,从而使游戏有一个以上的类型,长度和组大小。