2数据库设计问题。层次结构树

时间:2011-05-31 21:42:52

标签: php mysql database database-design hierarchy

1。)我有一个DB,每个条目代表一个任务。 并且在几十个甚至一百个任务中,将有一项特殊任务(这是一个里程碑)
因此,在这种情况下,我只有很少的条目需要额外的字段来将它们与大多数分开。

我不想创建第二个表,因为这是使这些里程碑石头特殊的唯一字段,它们与常规任务条目共享许多其他字段。

我是否应该创建另一个字段以保留一些TRUE,而其余字段为默认为

2.。)对于每个任务,它具有可变数量的执行者(取决于用户输入)  (为了进一步说明,每个表演者都有自己的多个子表演者。)所以我基本上使用数据库来描述一个TREE结构。我现在拥有它的方式是,如果有的话,我会有5份相同的任务信息是5个表演者,占据5个参赛作品。如果我的数据库中不会有超过10,000个条目(包括副本),这是要走的路吗?

谢谢

这应该澄清它

  1. Task1(这是里程碑任务)

    • performer1
      • 子表演者ID = 21
      • 子表演者ID = 542
    • performer2
  2. Task2(这不是里程碑任务)

    • performer2
      • 子表演者ID = 231
  3. Subperformer和表演者完全不同。完全没有重叠。 Subperformer是为表演者提供输入的组,因此表演者可以完成他们分配给的任务。

3 个答案:

答案 0 :(得分:1)

我不确定这是不是你想要的:

tblTask​​ with columns taskID,isMilestone以及您需要的所有内容。

tblAgent包含列agentID和您需要的所有内容(这些将是(子)表演者)。

使用列fk_agentID,fk_task

的性能

tbl与列fk_agentID_performer,fk_agentID_subperformer

的表现

使用fk_外键引用

fk_agent -> tblAgent.agentID
fk_task -> tblTask.taskID
fk_agentID_performer -> tblAgent.agentID
fk_agentID_subperformer -> tblAgent.agentID

答案 1 :(得分:0)

1)是创建一个布尔标志。

2)没有。如果您有重复数据,则表示您遇到问题。 你需要normalize

答案 2 :(得分:0)

你真的没有利用数据库的关系性质。这样做的好方法是:

  • 有一个任务表(有唯一的ID,没有额外的里程碑字段,没有预制器)
  • 有一个包含两列的里程碑表:任务ID和特殊里程碑字段 - 此表中只显示里程碑
  • 有一个包含两列的表:任务ID和执行者
  • 有一个包含两列的表:表演者和表演者

  • 如果表演者可以有多个字段,请在上表中使用prerformer id并拥有一个包含表演者ID和其他字段的表格

回复:评论

  

我已经读过规范化会降低数据库效率,这就是我将它们全部组合起来的原因。

在哪儿?这是一个非常奇怪的主张。

  

对于包含taskid和执行者的表(列表中的第3个),如果任务143需要人员A,B,C,那就是这样。在DB中,(第1行| 143 | A)(第2行| 143行) | B)(第3行| 143 | C)你还有冗余吗?

第三个表中的重复不是冗余问题,因为您没有复制任何信息:表中的信息是关于关系的,并且三行中有三个关系。

如果你有像你这样的设置,就会出现冗余问题,假设任务143有一个completion_date“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, 2011     B
143      May 31, 2101     C

现在你不知道哪个是正确的completion_date! 规范化时,一个表中只有一行来更改日期,并且数据库永远不会像那样不一致。