1

可以说我有2个表:更改外键含义。如何处理?

  • SpeciesId
  • SpeciesName

动物

  • 动物编号
  • SpeciesId - 外键

如果你给改变SpeciesName最终用户的能力,这意味着他们可能会影响引用更改的记录(至少从用户的角度来看)所有动物的物种。这可能是一个极端的例子,但这种情况通常如何处理?把最终用户的责任告诉他们在做什么?如果之前使用过名称更改,请禁止?

我们正在讨论这种情况,我想从其他人那里获得输入。提出的解决方案之一是删除外键(例如,为动物表中的物种放置文本字段)。这对我来说看起来并不正确,因为你在什么时候绘制了使用外键的界限?对我来说,似乎更像是一个培训问题,以确保管理员了解他们所做的更改的影响。我知道这是一个开放式的问题,根据情况可能会有所不同,但我只是想得到一些一般性意见。

+2

嗯,其中之一,Species.SpeciesName应该是唯一的,所以你不应该能够使用已经在使用的名称。否则,你的问题不是真正的答案 - 因为你的真实使用案例不是科学已经定义的例子,所以我们很难说出这些名称变化将会发生什么样的频率,它们会对其余的架构,或者为什么有一个文本列会更好,如果名称确实发生了变化。 – 2013-05-02 22:19:21

+0

为了减轻参考表中更改值所带来的一些痛苦,您可以实施更改跟踪,以便能够告诉谁,何时以及如何更改它们并在必要时恢复这些更改。 – peterm 2013-05-02 22:28:02

+2

您使用这种查找表的原因之一是,名称更改并不痛苦。在您的替代设计中,如果您拥有属于一个物种的5000只动物,并且您更改了物种的名称,则必须更新5000行(并且根据索引可能会更多)。当你有外键时,反复重复的代理(SpeciesId)不会改变;只有FK表中名称的* 1 *副本发生变化。此外,由于大多数名称可能会超过4个字符,因此您还可以使用SpeciesId在Animal表中节省大量空间。 – 2013-05-02 22:28:03

回答

0

这是您必须制作的设计决定。您需要从业务角度确定哪些更重要。你重视历史的准确性还是有效地更新信息?

在你的例子中,由于以下原因,我会不太重视历史。

  1. 只有最近的约定是重要的。假设一个动物从一个属性移动到另一个属性,它确实没有提供任何价值来知道什么是旧的和现在无效的属。

  2. 同一物种的所有动物都应该具有相同的物种ID。你可以免费获得这个免费的外键。假设在物种名称更改之前添加了一只老虎。然后在物种名称更改后添加了一只不同的老虎。两只老虎仍属于同一物种。

  3. 查询通过ID数据库会更容易,也比使用一个字符串,更不用说钻研字符串解析的业务更可靠。您不必担心字符编码,大小写,空格,标点符号等。假设您想要检索一个或多个物种的所有动物。

0

放在最终用户的责任,知道他们在做什么?

需要决定最终用户能够更新什么。如果您的最终用户是充分了解该物种科学名称的生物学家,他应该能够更新这些信息。否则,可能最好是防止用户修改此列,或者只有当此特定物种有与之相关的任何动物时。

,这就是一个带出来的解决方案是删除外键

不要那样做。您将失去加入这些表格信息的能力。想象一下你的桌子上的物种有一个“大陆”的列,表明这个物种是在美洲,非洲,欧洲,亚洲等地被发现的。如果你使用外键,你可以提问这样的问题:“属于美国的物种?“这是不可能的,如果你删除外键。