2009-11-22 62 views
1

我正在为数据库放在一起。数据库的目标是跟踪我们部门的应用程序。我有一个重复的问题,我正在努力解决。数据库设计 - 我需要两个数据库字段之一吗?

例如,我有一个“应用程序”表。我想跟踪如果任何应用程序使用一个数据库或bug跟踪系统,所以现在我有叫应用程序表中的字段

表:应用
UsesDatabase(位)
database_id的数据(INT)
UsesBugTracking(位)
BugTracking_ID(INT)

表:数据库:
ID

表:bug追踪:
ID

我应该巩固与各自的ID列中的“用途”一栏所以在申请表中只有一个bug跟踪列,只有一个数据库列?

这里的任何最佳实践数据库设计?


注:(虽然我猜这两种方法可能会产生这个数据)我想运行像报告“应用程序所占的百分比使用bug跟踪”

回答

4

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

编辑:
要回答你的笔记,就可以轻松搞定,像这样的统计数据:

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

两种解决方案的工作。但是,如果您认为偶尔可能需要获取包含数据库/错误跟踪的应用程序的列表,请考虑使用标记字段可减少一个(或两个)联接的查询。

有位域略非正规化,因为你必须保持同步两个领域保持一块更新的数据,但我更愿意他们的情况下,像这样因为我在上一段中给出的原因。

另一种选择是让字段为空,并为其中没有DBs/etc的条目填入空值,但会遇到外键约束问题。

我不认为有任何一种最高权利的方式,只要考虑权衡,并与您的应用程序的意义。

0

我会用3代表的对象:应用数据库,并bug跟踪。然后我将使用2个连接表来执行一对多连接:ApplicationDatabasesApplicationBugTracking

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

+0

OP已经有一对多关系,你所暗示的是多对多的关系。 – Guffa 2009-11-22 00:44:35

+0

我可以看到你为什么这么说,但它可能不需要在模型中。 – gbn 2009-11-22 07:09:42

1

为什么不能摆脱这两个使用领域,只是让在_ID领域NULL值表明,记录中没有使用该应用程序(bug跟踪或数据库)

+0

这就是我的问题。你的建议是? – leora 2009-11-22 00:45:29

-1

要回答的编辑question-

是,该领域应结合,与NULL这意味着应用程序不具有一个数据库(或bug跟踪器)。

+0

对于#1和#2,你误解了这个问题,数据库和bug跟踪器是完全独立的,并具有上面列出的独立表。我不是在问这些问题,把它们合并成一列 – leora 2009-11-22 01:13:59

0

“我应该巩固‘用途’栏”

如果我看看你的问题的陈述,那么无论有没有“用途”一栏可言,或有两个。无论哪种情况,您说“THE”使用栏目都是错误的。

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

+0

首先,你在这里接过一句话。我说过你应该将使用列与ID列整合在一起。 。 。我已经改变它更加明确,但我可以礼貌地建议你阅读完整的问题的上下文 – leora 2009-11-22 12:10:25

0

是在外键字段中使用null应该没问题 - 看起来多余的位字段。

这样做的另一种方式(虽然它可能被数据库人认为是邪恶的^^)是将它们默认为0,并在bugtrack和数据库表中添加名为“None”的ID 0数据行。 ..当你做这些报告时,除非你提出“无”值,否则你将不得不做更多的工作,因为它们也是一个整洁的百分比......