一张或四张桌子? (db结构)

时间:2012-06-23 11:38:43

标签: database data-structures language-agnostic

项目连接到:
一个或多个“区域”和/或
一个或多个“县”和/或
一个或多个“城市”和/或
一个或多个“地方”。


我的问题是我应该如何建立关系:

id | thingID | regionId | countyId | cityId | placeId

4 tables

id | thingId | regionId

id | thingId | countyId

id | thingId | cityId

id | thingId | placeId

还是有其他更好的解决方案?

2 个答案:

答案 0 :(得分:1)

第二种选择显然更好。这是每个类别的多对多关系,这就是第二个选项所描述的。

第一个选项会导致一些非常奇怪的数据。如果您有一个与所有不同类型相关联的ThingId,那么您将有一行填充了所有列。然后,如果您的ThingId需要绑定到另一个城市,您将有另一行只有cityId填写,其他列保持为空。

导致大量空值的表格设计通常(并不总是)表明您的模型存在缺陷。

答案 1 :(得分:1)

我可能会过度思考这个,但我认为“地区”,“县”,“城市”和“地方”之间可能存在关系 - 属于“地方”的项目也应属于城市,县和地区。

您可以在您提供的两种设计中解决此问题 - 但您需要相当多的额外逻辑。在第一个解决方案中,您需要确保每次插入记录时,从“从左到右”填充位置 - 只有“地点”的记录无效。

在第二个解决方案中,您需要填充所有相关行 - 切尔西的项目也必须包含伦敦,米德尔塞克斯和英格兰东南部的记录。

还有另一种方式......

Table: location
ID     Name                 Parent
------------------------
1     South East England    null
2     Middlesex             1
3     London                2
4     Chelsea               3
5     Kent                  1
6     Canterbury            5


Table: item
Id     name
-----------------
1      Posh Boy
2      Cricket ground
3      Rain

Table: item_location
ItemID    LocationID
--------------------
1        4    //Posh boy in Chelsea
2        2    // Cricket ground in Middlesex
3        1    // Rain in the South East of England.