数据库设计 - 我需要两个数据库字段中的一个吗?

时间:2009-11-22 00:36:18

标签: sql-server database-design

我正在为数据库整理架构。该数据库的目标是跟踪我们部门的应用程序。我有一个我试图解决的问题。

例如,我有一个“应用程序”表。我想跟踪任何应用程序是否使用数据库或错误跟踪系统,所以我现在在Applications表中有一个名为

的字段

表:应用程序
使用数据库(位)
Database_ID(int)
UsesBugTracking(位)
BugTracking_ID(int)

表:数据库:
ID
名字

表: BugTracking:
ID
名字

我是否应该将“使用”列与相应的ID列合并,以便应用程序表中只有一个错误跟踪列和一个数据库列?

这里有数据库设计的最佳实践吗?


注意:我想运行“使用错误跟踪的应用程序百分比”等报告(虽然我猜这两种方法都可以生成此数据。)

7 个答案:

答案 0 :(得分:4)

您可以删除“使用”字段并使id列可以为空,并让null值表示它不使用该功能。这是表示缺失值的常用方法。

编辑:
要回答您的说明,您可以轻松获得如下统计信息:

select
  count(*) as TotalApplications,
  count(Database_ID) as UsesDatabase,
  count(BugTracking_ID) as UsesBugTracking
from
  Applications

答案 1 :(得分:1)

为什么不摆脱两个Use字段,只需让_ID字段中的NULL值表示该记录不使用该应用程序(错误跟踪或数据库)

答案 2 :(得分:0)

两种解决方案都有效。但是,如果您认为您可能偶尔只想获得一个没有数据库/错误跟踪的应用程序列表,请考虑使用标记字段可以通过一个(或两个)连接来减少查询。

位字段稍微非规范化,因为你必须保持两个字段同步以保持一个数据更新,但我倾向于喜欢它们这样的情况因为我给了在前一段中。

另一种选择是将字段置为可空,并为那些没有DB / etc的条目添加null,但是你遇到了外键约束的问题。

我认为没有任何一种至高无上的正确方法,只需考虑权衡并选择对您的应用有意义的方法。

答案 3 :(得分:0)

我会为对象使用3个表:应用程序数据库 BugTracking 。然后我会使用2个连接表来进行1对多连接: ApplicationDatabases ApplicationBugTracking

2个连接表将同时具有application_id和另一个表的id。如果应用程序使用单个数据库,则它将具有将它们连接在一起的单个ApplicationDatabases记录。使用此设置,应用程序可以有0个数据库(ApplicationDatabases表中没有此应用程序的记录),或许多数据库(ApplicationDatabases表中此应用程序的多个记录)。

答案 4 :(得分:0)

“我应该合并”使用“栏目”

如果我查看你的问题陈述,那么根本就没有“使用”列,或者有两个。在任何一种情况下,你都不会说“THE”使用专栏。

我可以礼貌地建议你在提问时学会精确吗?

答案 5 :(得分:0)

是的,在外键字段中使用null应该没问题 - 拥有位字段似乎是多余的。

另一种方法(虽然它可能被数据库人员认为是邪恶的^^)是将它们默认为0并在bugtrack和数据库表中添加ID 0数据行,名称为“None”。当你做报告的时候,你必须做更多的工作,除非你提供“无”的价值,因为它们的整齐百分比......

答案 6 :(得分:-1)

回答编辑过的问题 -

是的,应该组合字段,NULL表示应用程序没有数据库(或错误跟踪器)。