使用外键根据另一个字段中的值限制字段中允许的值

时间:2017-12-14 20:34:00

标签: sql database

我有一个数据库表,其记录是" sales",其中一个字段是" Country" (发生销售的地方)。

我想确保人们只能输入有效的国家/地区名称(例如,韩国与韩国)。我不能使用CHECK约束来执行此操作,因为它不是固定值检查或基于行中的其他值。

但是,我认为它是使用外键约束的好选择:

  1. 创建一个新表格' countries'国家/地区名称是主键(我们还可以包含其他字段,例如' population',' currency_code'等等,如果我们想要,但这与我的问题相关)。
  2. 制作"国家"我的销售领域'表一个外键,参考" country_name"国家"中的主键表
  3. 这不仅可以强制执行一致的命名(如果使用UI,还可以显示选择列表),还可以进一步规范化我们的数据(现在国家级数据可以存储在一个地方)。

    是否有其他方法可以强制执行这些类型的选择列表'约束,选择列表可以是动态的(基于另一个可以更新的表)?

    我唯一担心的是,如果我们更改国家/地区名称,我们可能会对销售表造成严重破坏。也许更好的方法是改变"销售"来自" country" to" country_id"然后为国家/地区表中的每个国家/地区创建UUID。这样,用户仍然可以查找他们想要使用的ID(再次,可能通过图形选择列表),但如果我们重新命名该国家,我们将不会打破这些表。

    建议?

1 个答案:

答案 0 :(得分:0)

你是正确的,有一个单独的国家表将是更规范和灵活的方法,但一个价值可能会改变的领域永远不是一个很好的候选人成为一个主键 - 这通常是一个红旗你为主键选择了错误的字段。

混合方法适用于您所在国家/地区的主要密钥可能类似于" CountryCode"或者" CountryIdentifier",它可以是一个小字符字段,可以包含您使用的缩写或缩写名称,如标识符,使用与Sales表中的外键相同的值。然后,完整的国家/地区名称可能是您在Country表中标准化的其他字段之一,可能会在必要时更改,并且可以在您的UI中显示,但如果您需要直接查看数据,则可以使用一些更可读的数字或UUID。