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
有更好的方法吗? 我希望我的问题很明确。
答案 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图中它就像
现在您拥有了对象模型,创建数据库表会更容易。 NxN关系可以解释为包含两个id作为主键的中间表。在这种情况下,我们需要一个我称之为tbl_nearby
的表
女巫基本上是@ 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中。