2012-11-03 53 views
0

对不起,我对mysql和数据库一无所知,但我有点了解它。Mysql数据库设计了多个值的多个值

因此,假设以下情况:

我有一个定义(ball_definitions)表的不同颜色的球:

id color 
1 red 
2 blue 
3 green 
... 
N 

其中id是首要价值。

和我有第二个表(人)与人的定义:

id name 
1 John 
2 Peter 
3 Michel 
... 
M 

(其中id是主键)

现在,我想涉及到每个人,量拥有球由人,在概念上,是这样的:

john: 1 red ball, 3 green ball, 0 blue ball 
peter: 3 red ball, 2 green ball, 1 blue ball. 
... 

以这种方式,无论是M和N可以(为可移植性原因)而有所不同。

我的第一个难题是让人的桌子有N列,其中每列指的是每种颜色,但这不是可移植的(需要每次更改ball_definitions更改的触发器,而且看起来很难查询) 。

在另一方面,创建一个新表与“多对多”的关系:

persons_id ball_definitions_id amount 
1 1 1 
1 2 3 
1 3 0 
2 1 3 
2 2 2 
2 3 1 

在我看来,一点点的努力,当人的数量或球的数量变化。

有没有更好的解决方案?

干杯, 豪尔赫

+0

第二个解决方案又是什么问题?我真的不明白你在说什么,这对我来说这样做很有意义。 – Jasper

+0

@Jasper如果我添加一个新球,我必须为该表创建M个新条目。也许我不习惯这个,但是如果N和M很大并且我想从特定的人“我”查询表格(例如,为什么必须通过所有条目,如果我只想要条目第一个元素是“我”) –

回答

2

没有,有没有更好的解决办法。

当你有两个有N到N(多对多)关系的表时,你应该使用一个中间表。

另一种方法是在人表中为每种类型的球创建一个列,或者在球表中为每个人创建一个比您所描述的解决方案更加努力的列。如果你需要添加更多的球或人,事情变得非常复杂和混乱。你描述了最好的解决方案。

+0

可能有一个微妙的,我没有看到。 –

+1

如果添加一个新的球,如果大多数人有0个球,则不必为该表创建M个新条目。 当你更新一个人的球的数量时,你可以插入一条新记录,并且如果中间表中没有记录,则假设一个人'x'的球数为0。 –