问题描述
|
1.)我有一个数据库,其中每个条目代表一个任务。
在几十甚至一百个任务中,会有一个特殊的任务(这是一个里程碑)
因此,在这种情况下,我只有很少的条目需要一个额外的字段来将它们与大多数分开。
我不想创建第二个表,因为这是使这些里程碑石变得特别的唯一字段,它们与常规任务条目共享许多其他字段。
我是否应该创建另一个字段以仅保留一些TRUE,而其余字段则默认为false
2)对于这些任务中的每一项,它都有可变数量的执行者(取决于用户输入)
(进一步来说,每个执行者都有自己的多个子执行者。)因此,我实质上是使用数据库来描述TREE结构。现在,我拥有5个相同任务信息的副本。是5位表演者,占据5位。如果我的数据库中的条目不超过10,000个(包括副本),这是一种解决方法
谢谢
这应该澄清一下
Task1(这是一个里程碑任务)
表演者1
次执行者ID = 21
次执行者ID = 542
表演者2
Task2(这不是里程碑任务)
表演者2
次执行者ID = 231
表演者和表演者是完全不同的群体。完全没有重叠。次级执行者是为执行者提供输入的组,因此执行者可以完成分配给他们的任务。
解决方法
我不确定这是否是您想要的:
tblTask包含taskID列,isMilestone列以及您需要的所有内容。
tblAgent,其中包含agentID列和您需要的所有内容(这些将是(子)执行者)。
tblPerformance with fk_agentID,fk_task列
具有列fk_agentID_performer,fk_agentID_subperformer的tblSubperformance
被fk_外键引用
fk_agent -> tblAgent.agentID
fk_task -> tblTask.taskID
fk_agentID_performer -> tblAgent.agentID
fk_agentID_subperformer -> tblAgent.agentID
, 1)是,创建一个布尔标志。
2)没有。如果您有重复的数据,则有问题。
你需要规范化
, 您确实没有在利用数据库的关系性质。做到这一点的好方法是:
有一张任务表(具有唯一的ID,没有额外的里程碑字段,没有预成型者)
有一个包含两列的里程碑表:任务ID和特殊里程碑字段-仅里程碑将出现在该表中
有一个包含两列的表:任务ID和执行者
有一个包含两列的表:表演者和子表演者
如果一个表演者可以有多个字段,请在上表中使用一个预表演者ID,并有一个包含表演者ID和其他字段的表
回复:评论
我已经读到规范化会降低数据库效率,这就是为什么我将它们全部组合在一起的原因。
哪里?这是一个很奇怪的说法。
对于包含taskid和Performer的表(列表中的第3个),如果任务143需要职员A,B,C,则是这样。在DB中,(行1 | 143 | A)(行2 | 143 | B) (第3行| 143 | C)您仍然没有冗余吗?
第三个表中的重复不是冗余问题,因为您没有复制任何信息:表中的信息是关于关系的,并且在三行中有三个关系。
当您进行像您这样的设置时,会出现一个冗余问题,假设任务143的完成日期为“ 2011年5月31日”,那么您的表将如下所示:
task_id completion_date performer
143 May 31,2011 A
143 May 31,2011 B
143 May 31,2011 C
现在,假设我要更改任务143的completion-date
。在您的设置中,我必须在所有三行中对其进行更改,更糟糕的是,如果某人做错了,您将得到一个不一致的表,例如:
task_id completion_date performer
143 May 31,2011 A
143 May 12,2101 C
现在你不知道哪个是正确的completion_date
!
规范化时,一个表中只有一行可以更改日期,并且您的数据库绝不会那样不一致。