我应该整合这些数据库表。

时间:2010-09-01 01:12:42

标签: database database-design

我有一个带有sql数据库的事件日历应用程序,现在我有3个表来表示事件:

表1:假期
列:ID,日期,名称,位置,CalendarID

表2:假期
列:Id,Date,Name,PersonId,WorkflowStatus

表3:活动
列:Id,日期,名称,CalendarID

所以我有“通用事件”进入事件表和假期和假期等特殊事件进入这些单独的表。我正在辩论将这些整合到一个表中,并且只有像location和personid这样的列为通用事件留空。

表1:事件:
列:Id,日期,名称,位置,PersonId,WorkflowStatus

是否有人认为每个选项都有强烈的正面或负面影响。显然会有记录的列不一定适用,但这三个表有重叠。

6 个答案:

答案 0 :(得分:2)

如果是我的决定,我会把它们压缩成一张桌子。我将添加一个名为“EventType”的列,并在将数据导入新表时指定事件类型进行更新。

这样,你只需要索引一个表而不是三个(如果你觉得索引是必需的),数据都在一个表中,并且获取数据的查询会更加简洁,因为你不会不需要将所有三个表合并在一起,看看一个人做了什么。我没有看到在一张桌子上拥有所有内容的任何缺点(尽管可能会有一个人提出我没有想到的)。

答案 1 :(得分:2)

无论你构建它,应用程序都必须处理变体类型。在这种情况下,我建议您在DBM中使用单个表示,因为替代方法是需要多个查询。

因此,成为一个问题,即你在哪里坚持复杂性,即使在一个庞大的组织中,也很难产生足够的事件来担心DBMS优化。应用程序代码比硬连线模式更灵活。这是一个偏好的问题。

答案 2 :(得分:2)

如何将特殊事件子类型分类为Event超类型?通过这种方式,以后可以轻松添加任何新的特殊事件。

alt text

答案 3 :(得分:2)

数据完整性是将它们放在一个表中的最大缺点。由于这些都显示为所需的字段,因此您无法默认需要它们,并且必须编写触发器以确保正确维护数据完整性(是的,这必须在数据库中维护而不是,正如有些人所认为的那样,应用程序。除非您当然想要解决数据完整性问题。)

另一个问题是,这些是您现在需要的事件,未来可能会有越来越多的专业事件,并且可能会破坏一种类型事件的代码,因为您添加了另一个仅适用于其他类型的专业字段是一个很大的事件风险。当您进行更改以添加一些必需的度假信息时,您是否确定检查它是否不会破坏有关假期的应用程序?或者更糟糕的是没有错误,但显示你不想要的信息?你每次都要看实际的屏幕吗?仅仅对代码进行单元测试可能无法获得这种类型的东西,特别是如果有人愚蠢地使用select *或者未能在插入中指定列。坦率地说,并非每个组织实际上都有一个非常彻底的自动化测试流程(如果你这样做可能会降低风险)。

我个人倾向于选择Damir Sudarevic的解决方案。所有公共字段的事件表(使得至少可以获得所有事件的列表变得容易)和不常见的字段的专用表,使得编写仅影响一个事件并允许数据库维护的代码更加简单它的完整性。

答案 4 :(得分:1)

如果需要将数据合并到一个结果集中以供使用,请将它们保存在3个单独的表中并在视图中执行UNION ALL。只要性能足够,如何将数据存储在磁盘上就不必与消耗数据的方式相同。

正如您现在所拥有的,没有列不适用于任何呈现的实体。如果要将3个表合并为一个表,则必须至少添加一个字段,以便知道要填充哪些列并降低性能。现在,当您单独查询假期时,您将转到必须筛选/索引的数据子集,以获取合并存储表中的相同数据。

如果您还没有定义这些表,可以考虑使用以下签名创建一个表...

create table EventBase (
  Id int PRIMARY KEY,
  Date date,
  Name varchar(50)
)

...比如假日表,签名如下。

create table holiday (
  Id int PRIMARY KEY,
  EventId int,
  Location varchar(50),
  CalendarId int
)

...并在需要时加入这两个。在这个和你已经拥有的3个独立表之间进行选择取决于你计划如何使用表和卷,但我绝对不会将所有表全部放入单个表中,并且对于那些查看表定义的人来说不那么清楚引发。

答案 5 :(得分:1)

或者组合公共字段并分离出独特字段:

表1:EventCommon

列:EventCommonID​​,日期,名称

表2:EventOrHoliday

列:EventCommonID​​,CalendarID,isHoliday

表3:假期

列:EventCommonID​​,PersonId,WorkflowStatus

在EventCommon与其他2之间存在1->多个关系。