【问题标题】:2 Database Design Questions. hierarchy tree2 数据库设计问题。层次树
【发布时间】:2011-05-31 21:42:52
【问题描述】:

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

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

我是否应该创建另一个字段来保存一些 TRUE,而其余的默认为 FALSE

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

谢谢

这应该澄清一下

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

    • 表演者1
      • 次执行者 ID=21
      • 次执行者 ID=542
    • 表演者2
  2. Task2(这不是里程碑任务)

    • 表演者2
      • 次执行者 ID=231

次执行者和执行者是完全不同的群体。完全没有重叠。子执行者是向执行者提供输入的组,因此执行者可以完成分配给他们的任务。

【问题讨论】:

  • 我不喜欢什么是执行者——他们是任务的分配者还是“子任务”?
  • 执行者是子任务吗?一个人 ?什么是子人?
  • 执行者任务是 n-1 关系还是 n-m 关系?表演者对次表演者是 1-n 还是 n-m?表演者可以是次表演者吗?表演者可以成为自己的次要表演者吗?

标签: php mysql database database-design hierarchy


【解决方案1】:

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

tblTask​​ 包含列 taskID、isMilestone 以及您需要的所有内容。

tblAgent 列 agentID 和您需要的一切(这些将是(子)表演者)。

tblPerformance 与列 fk_agentID、fk_task

tblSubperformance 与列 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

【讨论】:

  • 我发布了一个 EDIT,其中包含一个描述结构的列表。此数据库中没有“性能”字段。只是任务(tier1),performer(tier2),sub-performer(tier3)
  • 所以你不能改变你的数据库布局以提高效率? tblPerformance 将是实现执行者和任务之间的 m-n 关系的表,而 tblSubperformance 将是一个用于子执行者和执行者之间的 m-n 关系的新表。
  • 现在我明白你的意思了。我认为性能是一个新事物。我可以改变我的桌子。感谢您的详细解释。澄清一下,在 tblPerformance 表中,如果我有人 A,任务 1 的人 B。然后它会像 (-task1 fk_ID | Person A)
    (-task1 fk_ID | Person B)
  • 假设 task1 的 ID 为 42,代理 A 的 ID 为 2332,代理 B 的 ID 为 1234。假设代理 A 和代理 B 是任务 1 的执行者。那么您必须在 tblPerformance 中的行,即(2332, 42) 和 (1234, 42)。假设 ID 为 5555 的代理 C 是代理 A 的子执行者,那么在 tblSubperformance 中您将有一行显示 (2332, 5555)
  • 谢谢!这是一个非常详细的解释。现在我有工作要做来修改我的脚本。
【解决方案2】:

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

2) 没有。如果你有重复的数据,你就有问题。 你需要normalize

【讨论】:

  • 即使在层次结构的情况下,您是否应该完全规范化以消除所有重复。效率不会受到影响吗?
【解决方案3】:

您实际上并没有利用数据库的关系特性。这样做的好方法是:

  • 有一个任务表(具有唯一 ID,没有额外的里程碑字段,没有 preformer)
  • 有一个包含两列的里程碑表:任务 ID 和特殊里程碑字段 - 只有里程碑才会出现在此表中
  • 有一个包含两列的表:任务 ID 和执行者
  • 有一个包含两列的表:performer 和 sub-performer

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

回复:评论

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

在哪里?这是一个很奇怪的说法。

对于包含 taskid 和 performer 的表(列表中的第 3 个),如果任务 143 需要员工 A、B、C。在 DB 中,(第 1 行| 143 | A)(第 2 行| 143 | B) (row 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, 2011     B
143      May 31, 2101     C

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

【讨论】:

  • 我已经读到规范化会降低数据库效率,这就是我将它们结合起来的原因。那么,我的情况是否适合完全正常化并且效率仍然不会受到影响?对于包含 taskid 和 performer 的表(列表中的第三个),如果任务 143 需要员工 A、B、C,会是这样吗?在 DB 中,(第 1 行| 143 | A)(第 2 行| 143 | B) (第 3 行| 143 | C)你还没有冗余吗?
  • 我在 O Reily 的 Php、Mysql、Javascript 书中读到了这一点。但我会听取你的建议并将它们分开。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 2016-10-24
  • 1970-01-01
相关资源
最近更新 更多