分层数据库,具有父ID的多个表或列?

时间:2010-02-26 11:37:14

标签: sql mysql database

我需要在mysql数据库中存储有关挪威郡,市和城市的信息。它们以等级方式相关(一个城市属于一个同样属于一个县的市政当局)。

最好将它存储为三个不同的表并通过外键引用,还是应该将它们存储在一个表中并将它们与parent_id字段关联?

两种解决方案的优缺点是什么? (两者结构效率明智)

10 个答案:

答案 0 :(得分:4)

如果你真的有这三个级别(县,市,市)的限制,我认为你最开心的是三个单独的表,外键每个达到一个级别。这将使查询几乎无关紧要。

使用带有引用同一个表的parent_id字段的单个表允许您表示任意树结构,但使查询从节点到根提取完整路径,这是在应用程序代码中最佳处理的迭代过程。

单独的表格解决方案将更容易使用。

答案 1 :(得分:3)

CountyMunicipalityCity听起来不像是同一类数据;所以,我会使用三个不同的表:每个数据类型一个。

然后,我确实会在这些之间使用外键。


说效率,不确定它会有多大变化:

  • 你会在3张桌子上加入,而不是在同一桌子上加入3次;我想这是完全一样的。
  • 当你只需要处理这三种数据中的一种时,它可能会有所不同;但是如果使用正确的索引,差异应该是最小的。

但是,从结构上讲,如果这些是三种不同的实体,那么使用三种不同的表是有意义的。

答案 2 :(得分:3)

三个不同的表格:

  • 效率更高,如果您的应用程序主要访问仅有一个实体(县,市,市)的信息
  • owner-member-relationship是一个清晰而优雅的模型;)

答案 3 :(得分:1)

我建议使用三个不同的表,因为它们是三个不同的实体。

在这些情况下,我只使用一个表,你不知道层次结构的深度,但事实并非如此。

答案 4 :(得分:1)

我会把它们放在三个不同的表中,只是因为它有3个不同的概念。这会妨碍速度并使查询复杂化。但是,鉴于MySQL没有对hirachical查询的任何特殊支持(如Oracle的 connect by 语句),无论如何这些都会很复杂。

答案 5 :(得分:1)

不同的表:它只是“正确”。我怀疑你会看到任何性能增益/损失,但这是一个正确地预先建模它可能会在以后节省很多麻烦。首先,它将使SQL SELECT更容易编写和阅读。

答案 6 :(得分:1)

你会得到不同的意见,但我个人的偏好是拥有单独的表,因为它们是独立的实体。

实际上,您需要考虑您将对此数据进行的查询,通常您的答案将来自此。使用单独的表格,您的查询看起来会更清晰,最终您不会自己保存任何内容,因为您仍然会将表格连接在一起,即使它们是同一个表格。

答案 7 :(得分:0)

我会使用三个单独的表,因为您确切地知道您正在使用哪些类别的信息,并且不需要动态地改变层次结构的“深度”。

它还可以使数据更易于管理,因为您只需了解表格就可以判断数据是用于城市,市政府还是县(而无需识别数据的“深度”)层次结构中的记录首先!)。

既然你可能会进行自我加入以使层次结构起作用,我怀疑将所有数据放在一个表中会有什么好处。

答案 8 :(得分:0)

在数据软件外壳应用程序中,Kimball方法的拥护者可能会将这些字段放在同一个属性表中:

create table city (
   id int not null, 
   county varchar(50) not null,
   municipality varchar(50),
   city varchar(50),
   primary key(id) 
);

这个想法应该永远不会超过事实表。

我只是将此作为另一种观点。我会亲自参加3桌设计。

答案 9 :(得分:0)

这是“数据库规范化”的一种情况,它是组织关系数据库的字段和表以最小化冗余和依赖性的过程。目的是隔离数据,以便可以在一个表中进行字段的添加,删除和修改,然后通过定义的关系传播通过数据库的其余部分。 如果任务已在不同开发人员之间分配,则多个表将有助于这种情况,或者不同级别的用户需要不同的权限来查看和更改数据,或者当您将此数据用于其他目的时,小表也会有所帮助。 我的投票将是多个表格 - 数据适当分配。