Database design 如何设计具有父子关系的数据库?

Database design 如何设计具有父子关系的数据库?,database-design,normalization,Database Design,Normalization,如果我需要在数据库中表示位置(例如国家、州/省/地区、城市等),我将如何以最容易查询、规模最大的方式进行表示。?我计划将其用于一个应用程序,该应用程序将允许用户选择多个位置并将它们与他们的配置文件关联 我想到的解决方案是: =========================== | Id | ParentId | Name | =========================== | 1 | 0 | USA | --------------------------

如果我需要在数据库中表示位置(例如国家、州/省/地区、城市等),我将如何以最容易查询、规模最大的方式进行表示。?我计划将其用于一个应用程序,该应用程序将允许用户选择多个位置并将它们与他们的配置文件关联

我想到的解决方案是:

===========================
| Id | ParentId | Name    |
===========================
| 1  | 0        | USA     |
---------------------------
| 2  | 1        | Alabama |
---------------------------

我想知道这样的解决方案是否有潜在的问题。谢谢。

这似乎非常适合于可伸缩性,但是我可能会添加一列来标识实际的行/条目(如果您愿意的话,实体类型)

这将允许您根据选择(国家、城市等)轻松查询。您可能会发现hiracrchy可能会给您带来一些痛苦,因为整个结构都在一个表中,您不知道开始时的深度


最终,设计将取决于您可能拥有的已知子部分的数量,而这种规范化是否实际上会使生活更加困难。

如果您知道不同类型的项目(城邦国家),您应该创建单独的表。将它们全部放在一个表中会使查询更加困难

如果使用不同的表类型,则可以强制执行引用完整性,这样就不会产生孤立


想想孩子们

我使用了类似的东西,并取得了很大成功。最近的一次可能会派上用场


在某些情况下(比如这样),我不想被束缚在一个表结构上。自我参照可能是一件很棒的事情。我不明白为什么在代码中使用相同对象类型的树状结构是可以接受的,但在数据库方面程序员却回避它。

取决于你的受众,您可能还需要考虑通过类型来分离名称值,以便可以在不复制层次结构的情况下本地化它们。

您可以在自联接中强制执行引用完整性。你只需要为没有父项引用的行制定一个规则,要么是它们自己,要么是指定的“根”记录。我想我不知道所有不同类型的项。不同的国家划分不同的地理区域。我需要有一个支持n级层次结构的设计。@StackOverlownEWBIE-我明白了,那么你的设计是好的,有意义的。但下层选民愿意解释一下吗?在我发布我的答案之前,我无法猜到他的评论…+1是为了思考孩子们!。同意将项目分开,我使用的是父节点id方法。你能详细说明一下吗?DB设计中的名称/值对也有自己的问题。如果我事先不知道我有什么“类型”,该怎么办?