Sql server 数据库设计-国家/地区、货币int或varchar的主键

Sql server 数据库设计-国家/地区、货币int或varchar的主键,sql-server,database,sql-server-2008,database-design,Sql Server,Database,Sql Server 2008,Database Design,对于我的国家表,我使用了 国家代码作为主键“AU, 美国、英国、法国等 对于我的货币表,我使用货币代码作为主键“AUD、GBP、USD”等 我认为我所做的是可以的,但另一个开发人员希望我将所有主键更改为int,因为国家代码、货币代码可能会在将来某个时候更改。我们只是不知道,在这种情况下,他是对的,他的道路是最安全的道路 我是否应该将主键更改为int以确保安全而不是抱歉?我不能保留它吗?是的,在为时已晚之前,更改为整数键是个好主意 例如,如果英国加入欧元区怎么办?我想说,“一个国家的诞生”或一种

对于我的国家表,我使用了 国家代码作为主键“AU, 美国、英国、法国等

  • 对于我的货币表,我使用货币代码作为主键“AUD、GBP、USD”等

  • 我认为我所做的是可以的,但另一个开发人员希望我将所有主键更改为int,因为国家代码、货币代码可能会在将来某个时候更改。我们只是不知道,在这种情况下,他是对的,他的道路是最安全的道路


    我是否应该将主键更改为int以确保安全而不是抱歉?我不能保留它吗?

    是的,在为时已晚之前,更改为整数键是个好主意

    例如,如果英国加入欧元区怎么办?

    我想说,“一个国家的诞生”或一种货币的消失——总的来说——是一种相当罕见的现象——不太可能每年发生几次

    因此,在这方面,我认为使用ISO定义的国家和货币代码作为主键应该是可以的

    是的,如果欧元区发生了什么事情,或者如果另一个国家一分为二,你可能需要做一些手工整理工作——但你也必须用
    INT
    来做。在这种情况下,我认为人工代理键(比如
    INT
    )实际上只会增加开销,并不能真正帮助保持事情更简单/更明确


    由于这些代码非常短,并且通常都是相同的长度,因此我建议使用
    CHAR(3)
    CHAR(5)
    ——对于如此短的字符串,使用
    VARCHAR
    没有任何意义,而且,VARCHAR作为可变长度字段的行为也非常不同(在性能方面不是“更好”)固定长度字段,如
    INT
    CHAR

    我将使用ISO代码和CHAR列


    如果一个国家分裂了,你会得到新的ISO代码(比如SC、WL、EN),但英国对历史数据仍然有效


    货币也是如此。2000年的交易将使用当时的货币:法国法郎、德国马克、比利时香蕉,而不是欧元。

    只要引用这些主键的外键在更新级联时声明为
    ,谁在乎这些代码是否更改

    查询任何引用表还有一个额外的好处-如果您只需要国家/货币代码,那么就不需要加入这些表-这些表中已经包含了代码



    如果您确实决定移动到INT代理,请记住仍然对这些列放置唯一的约束-它们是这些表的真正键。

    将某些内容用作发生更改的主键是一种不好的做法。假设值已更改,然后必须更新所有子记录。这样做可能会将数据库锁定数小时甚至数天。这就是为什么在自然键上具有唯一索引的整数FK对于易变信息是更好的做法。

    从逻辑角度来看,添加代理意味着额外的列、额外的键约束和更复杂的逻辑来查询和操作数据。这是一件需要考虑的事情。

    从物理角度来看,在SQL Server中,整数键将占用比字符(2)或字符(3)多两倍的空间。这意味着您的引用表和索引变大了。它还使得对这些外键值的任何更新都要昂贵得多。我不知道您的数据,但这些外键列中的引用数据很可能比父表中的国家代码和货币代码值更新得更频繁。相比之下,货币和国家的ISO代码几乎从未改变,因此这可能没什么可担心的。通过更改为整数键,很可能会增加更新这些外键值的成本


    如果您将这种更改视为性能优化,那么我建议您非常仔细地评估整数键是否会使这些值的更新成本更高或更低。我建议你忽略那些说“永远做X”的人。教条对数据库设计毫无帮助。评估实践中的实际影响,并做出相应的决定。

    我认为,在ISO关于国家和货币代码的标准生效之前,您的系统将被淘汰十次


    因此,我真的不认为使用01010101 01010011或21843而不是“US”有任何好处。

    我将使用INT-id作为键而不是ISO代码,并向您解释为什么:

    我所在的组织使用“自有货币”(LBP)——例如,当用户执行某些交易时,他会收到一定数额的LBP作为奖金。此外,他可以将这些LBP兑换成美元、欧元等,反之亦然,用LBP等支付服务费用。此外,我在ISO标准中没有找到BTC(比特币)货币

    是的,这些不是官方货币,但从系统和用户的角度来看,将它们作为货币而不是作为用户可以买卖的附加产品更为灵活

    我工作的组织不使用INT作为主键,他们使用ISO代码作为ID(加上那些额外的货币)

    官方称,LBP是黎巴嫩镑的ISO标准-因此他们无法顺利将黎巴嫩镑添加到系统中

    如果您通过代码识别您的货币,并且将来某些新货币将注册为ISO标准(例如LBE或BTC),那么这些货币将与“您的”货币冲突

    这里有人提到,为货币添加int键是一个额外的索引。 但是,对不起,300条记录(大约货币数)有问题吗?此外,如果您使用INTs作为货币的主键,它还有一个额外的好处:想象一个包含100万笔交易的表,其中包含金额和货币,还有什么更有效