在mysql中设计表

时间:2010-10-09 08:50:29

标签: mysql

Mysql,php新手在这里。请你好。

我有一个殖民地名单--colony1,colony2,...,colony100。

Say Colony5就在colony4,colony9和colony10附近。 Colony4靠近colony5,colony9,colony10和colony11。不同的殖民地有不同数量的附近殖民地。

如何在mysql中存储和获取此数据?

目前我正在考虑一个看起来像这样的表 - >

id |殖民地名称| nearby_colony_id_1 | nearby_colony_id_2 | nearby_colony_id_3 | nearby_colony_id_4

有更好的方法吗? 我希望我的问题很明确。

3 个答案:

答案 0 :(得分:4)

设计表很有趣!

如果要存储“nereby”的数据,可以使用图形(数据结构)进行存储。如果你不关心附近的细节,只关心附近的殖民地,你可以用另一张桌子来做。不要做你想做的事(id_2,id_3等)这不是规范化的数据库,可能导致异常。很多人第一次犯这个错误。

CREATE TABLE
   Colonies (`id` int unsigned NOT NULL auto_increment, `name` varchar(255));
CREATE TABLE
   Nearby_colonies (`a_id` int unsigned NOT NULL, `b_id` int unsigned NOT NULL);

所以你在殖民地的桌子上有你的殖民地。然后,对于该殖民地附近的每个殖民地,您在Nearby_colonies中都有一对具有一对ID的条目(顺序无关紧要,但名称必须不同)。这将两个殖民地连接为附近的殖民地。现在,一个殖民地可以拥有尽可能多的Nearby_colony条目,而不仅限于id_2,id_3,id_4等。

这也可以防止异常发生,因为关系本身是为每个殖民地存储的,而不仅仅是针对另一个殖民地。

如果你想更具体地存储两个殖民地之间的距离,没问题!只需在Nearby_colonies中添加另一个字段即可。显然,从菌落a到菌落b的距离在任一方向都是相同的; P

答案 1 :(得分:3)

我想你已经有了答案,但重要的是理解解决方案背后的想法,以便将来你可以自己做。

在多对多关系中,您有一个名为colonies的类与自身相关(例如“一个殖民地附近有多个殖民地”)。这称为 NxN递归关系。在一个简单的UML图中它就像

alt text

现在您拥有了对象模型,创建数据库表会更容易。 NxN关系可以解释为包含两个id作为主键的中间表。在这种情况下,我们需要一个我称之为tbl_nearby

的表

alt text

女巫基本上是@ tandu的答案,但我更喜欢使用外键,因为它会保持数据的完整性。

使用UML对象模型然后将该模型转换为数据库表是一个好主意,因为这样您可以更轻松地设计真正复杂的模型

祝你好运

答案 2 :(得分:2)

你需要两张桌子。第一个将保留殖民地规范(id,name,...),第二个将保持殖民地之间的链接。在第一个表中,每个殖民地将有一行。

例如:

Id Name
1  colony1
2  colony2
3  colony3
4  colony4

在第二个表格中,您将拥有一个用于殖民地身份的列,一个用于附近殖民地身份的列。在此表中,每个殖民地邻居将有一行。

Ex(此处colony1将菌落2和3作为附近的菌落):

ColonyId NeighbourId
1        2
1        3

您可以使用foreign key确保表1中引用的群体确实存在于表1中。