Database design 改进关系设计用户国-州-市之间的关系数据库模型?

Database design 改进关系设计用户国-州-市之间的关系数据库模型?,database-design,relational-database,Database Design,Relational Database,我设计了用户、国家、州和城市之间的数据库关系。我认为这不是一个好的设计,可能会有所改进,因为is有循环引用 哪一个是重新设计的好方法 更新 带着这些答案,我找到了一个新的设计 在数据库设计中,不需要国家-州-城市的关系。这是多余的。因此,我的建议是删除表州和表城市 更新: 如果您的设计做得很好,并且有充分的理由保证您提到循环引用,那么留下这样的引用是没有问题的 我以为你有一个循环引用例外,但在阅读@reaanb post后,我同意他的观点 在数据库设计中,不需要国家-州-城市的关系。这是多余

我设计了用户、国家、州和城市之间的数据库关系。我认为这不是一个好的设计,可能会有所改进,因为is有循环引用

哪一个是重新设计的好方法


更新

带着这些答案,我找到了一个新的设计


在数据库设计中,不需要国家-州-城市的关系。这是多余的。因此,我的建议是删除表州和表城市

更新:

如果您的设计做得很好,并且有充分的理由保证您提到循环引用,那么留下这样的引用是没有问题的


我以为你有一个循环引用例外,但在阅读@reaanb post后,我同意他的观点

在数据库设计中,不需要国家-州-城市的关系。这是多余的。因此,我的建议是删除表州和表城市

更新:

如果您的设计做得很好,并且有充分的理由保证您提到循环引用,那么留下这样的引用是没有问题的


我以为你有一个循环引用例外,但在阅读@reaanb post后,我同意他的观点

我正在努力找出你想要实现的目标。我可以想象两件事,但也可能是别的

首先,您试图只表示地理数据(包含在州中的城市,包含在国家中的城市)。用户指向一个城市,然后链接到一个州和一个国家

第二,您允许用户以3个精度级别中的任意一个级别提供他们的地址。也就是说,他们可以说他们居住在哪个城市,或者只是哪个州,甚至是哪个国家

如果您试图只做第一个,那么您应该摆脱用户->州和用户->国家关系,并将用户链接到just city。如果您需要知道用户所在的州和/或国家,只需从一个城市加入到另一个州和/或国家

如果你想做第二个,那么它看起来很像,所以我建议你阅读链接的帖子,看看你认为哪一个最适合你

如果你想两者兼顾,那么我认为你有两个选择。第一种方法是保持模式不变,但通过业务逻辑强制用户的地址字段中只有一个字段是非空的。这将避免用户可能指出的问题,例如,处于不同状态的州和城市

第二,明确你有3种地址类型(所有级别,仅国家+州,仅国家)。从表的角度来看,这是比较昂贵的,但可以更清楚地了解发生了什么,即约束不会隐藏在业务逻辑中

对于第二个选项,您将有如下内容:

用户
@用户id
(删除地址字段)

国家
@国家/地区id
(其他领域)

状态
@州id
国家/地区id(外键)

城市
@城市id
状态id(外键)

L1\u地址
@l1_地址_id
国家/地区id(外键)
地址\u id(外键)

L2\u地址
@l2\u地址\u id
状态id(外键)
地址\u id(外键)

L3\u地址
@l3\u地址\u id
城市id(外键)
地址\u id(外键)

用户地址
@用户Id

@地址_id

我正在努力找出你想要实现的目标。我可以想象两件事,但也可能是别的

首先,您试图只表示地理数据(包含在州中的城市,包含在国家中的城市)。用户指向一个城市,然后链接到一个州和一个国家

第二,您允许用户以3个精度级别中的任意一个级别提供他们的地址。也就是说,他们可以说他们居住在哪个城市,或者只是哪个州,甚至是哪个国家

如果您试图只做第一个,那么您应该摆脱用户->州和用户->国家关系,并将用户链接到just city。如果您需要知道用户所在的州和/或国家,只需从一个城市加入到另一个州和/或国家

如果你想做第二个,那么它看起来很像,所以我建议你阅读链接的帖子,看看你认为哪一个最适合你

如果你想两者兼顾,那么我认为你有两个选择。第一种方法是保持模式不变,但通过业务逻辑强制用户的地址字段中只有一个字段是非空的。这将避免用户可能指出的问题,例如,处于不同状态的州和城市

第二,明确你有3种地址类型(所有级别,仅国家+州,仅国家)。从表的角度来看,这是比较昂贵的,但可以更清楚地了解发生了什么,即约束不会隐藏在业务逻辑中

对于第二个选项,您将有如下内容:

用户
@用户id
(删除地址字段)

国家
@国家/地区id
(其他领域)

状态
@州id
国家/地区id(外键)

城市
@城市id
状态id(外键)

L1\u地址
@l1_地址_id
国家/地区id(外键)
地址\u id(外键)

L2\u地址
@l2\u地址\u id
状态id(外键)
地址\u id(外键)

L3\u地址
@l3\u地址\u id
城市id(外键)
地址\u id(外键)

用户地址
@用户Id
@地址\u id

您没有任何通知
user_id -> city_id
user_id -> state_id
user_id -> country_id
city_id -> state_id
state_id -> country_id