改变外键的含义。如何处理?

时间:2013-05-02 22:15:40

标签: sql sql-server database database-design business-intelligence

假设我有两张桌子:

  • SpeciesId
  • SpeciesName

动物

  • AnimalId
  • SpeciesId - 外键

如果您授予最终用户更改SpeciesName的权限,则意味着它们可以影响引用已更改记录的所有动物的种类(至少从用户角度来看)。这可能是一个极端的例子,但这样的情况通常如何处理?将责任放在最终用户身上以了解他们在做什么?如果之前已使用过,请禁止更改名称?

我们正在讨论这种情况,我希望得到其他人的意见。提出的解决方案之一是删除外键(例如,在Animal表中放置物种的文本字段)。这对我来说似乎不对,因为你在什么时候画出使用外键的线?对我而言,确保管理员了解他们所做的更改的影响似乎更像是一个培训问题。我知道这是一个开放式的问题,每个场景可能会有所不同,但我只是想得到一些普遍的意见。

2 个答案:

答案 0 :(得分:0)

这是您必须做出的设计决策。您需要从业务角度确定哪些更重要。您是否重视历史准确性或有效更新信息?

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

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

  2. 同一物种的所有动物应具有相同的物种ID。您可以使用外键免费获得此物种。假设在物种名称更改之前添加了一只老虎。然后在物种名称改变后添加了另一只老虎。两只老虎仍属于同一物种。

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

答案 1 :(得分:0)

  

将责任放在最终用户身上以了解他们在做什么?

需要决定最终用户能够更新的内容。如果您的最终用户是一位了解物种科学名称的生物学家,他应该能够更新这些信息。否则,也许最好阻止用户修改此列,或者仅当此特定物种有任何与之相关的动物时才这样做。

  

提出的解决方案之一是删除外键

不要那样做。您将无法加入这些表中的信息。想象你的桌子物种有一个列“大陆”,表明这个物种是在美国,非洲,欧洲,亚洲等地找到的。如果你使用外键,你可以问诸如“什么是所有的动物属于一个美国物种?“如果删除外键,则无法执行此操作。