是否有必要为简单的表使用外键

时间:2014-04-25 11:25:05

标签: sql database-normalization

有一个名为RoundTable

的表格

它有以下列

RoundName
RoundDescription
RoundType
RoundLogo

现在,RoundType的值类似于" Team"," Individual"," {{1 }}"

是否需要再增加一个名为" Quiz"的表格。列

RoundTypes

并从回合表中删除TypeID RoundType ,然后有一列" RoundType"哪个有TypeID表的外键?

有人说如果你在同一个表中有RoundType就像硬编码一样,因为将来会有很多圆形类型。 如果只有2-3种圆形类型,我不需要外键吗?

4 个答案:

答案 0 :(得分:4)

有必要吗?显然不是。 SQL无论哪种方式都可以。在正确定义的数据库中,您可以为RoundType执行以下两项操作之一:

  1. 有一个查找表
  2. 有一个约束,检查值是否在商定的集合内(我会将enum放入此类别中)
  3. 如果你有一个查找表,我会主张为它提供一个自动递增的id(称为RoundTypeId)。请记住,在更大的数据库中,这样的表通常会有两列以上:

    • CreatedAt - 创建时
    • CreatedBy - 谁创建了它
    • CreatedOn - 创建它的位置(对分布式系统很重要)
    • 长名

    在更高级的系统中,您可能还需要使系统国际化 - 即使其适用于多种语言。然后你会在其他表中查找实际的字符串值。

答案 1 :(得分:2)

  

是否只有2-3种圆形,我不需要   有外键??

通常恰恰相反:如果大多数记录的值不同(例如“lastName”列中的值),则不会使用查找表。

但是,如果您知道您将拥有一组有限的允许/可能值,则通过外键引用的查找表可能是更好的解决方案。

也许阅读“数据库规范化”,或许可以从@ Wikipedia开始。

答案 2 :(得分:1)

实际上,如果实体之间存在以下关联,则需要使用单独的表

  1. 一对多
  2. 很多很多
  3. 由于这些关联,简单的DBMS变成了** R ** DBMS(Relation。)

    现在问一个简单的问题, 圆桌中的单个记录是否有多个roundType? 如果是这样..制作一个新表并在ROUNDTable中使用外键。

    否则没有。

答案 3 :(得分:0)

是的,我认为你应该将它正常化。因为如果你不这样做那么你必须一次又一次地为每条记录输入圆形类型(值),如果你有大数据的话,这根本不是很好的做法。所以我建议你再制作一张桌子

但是稍后您可以查看以获得所需的结果作为休闲

创建视图vw_anyname 如 从圆桌连接tblroundtype中选择RoundName,RoundDescription,RoundLogo,RoundType on roundtable.TypeID = tblroundtype .typeid

从vw_anyname

中选择*