项目连接到:
一个或多个“区域”和/或
一个或多个“县”和/或
一个或多个“城市”和/或
一个或多个“地方”。
我的问题是我应该如何建立关系:
id | thingID | regionId | countyId | cityId | placeId
或
4 tables
?
id | thingId | regionId
id | thingId | countyId
id | thingId | cityId
id | thingId | placeId
还是有其他更好的解决方案?
答案 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.