【问题标题】:Where to state a foreign key when creating a table?创建表时在哪里声明外键?
【发布时间】:2012-01-15 22:52:35
【问题描述】:

我想设计一个名为arguments 的表,其属性name 链接到名为names 的表中的另一个属性name

我看到了两种用 SQL 表达它的方式:

  1. 通过在表上创建约束:

    CREATE TABLE names (   name text UNIQUE,
                          short text UNIQUE,
                        comment text);
    CREATE TABLE arguments (   name text UNIQUE,
                            comment text,
                            FOREIGN KEY (name) REFERENCES names (name));
    
  2. 通过动态限定属性:

    CREATE TABLE names (   name text UNIQUE,
                          short text UNIQUE,
                        comment text);
    CREATE TABLE arguments (   name text UNIQUE REFERENCES names (name),
                            comment text);
    

我想知道:

  • 如果两者中的一个通常被认为比另一个更好,并且
  • 如果它会产生我应该注意的后果。

感谢您的帮助。

【问题讨论】:

  • 您使用的是什么关系型数据库? MySQL?数据库服务器?等等?
  • 使用文本数据作为键是一种不好的做法。您的名称表应该有一个 ID 列,然后这将成为任何引用的 FK。
  • @cdeszaq 我正在使用 SQLite(用于概念证明)。
  • 如果这只是概念证明,那没关系。完成证明,然后进行实际工作。不要浪费时间解决现在不存在的问题。
  • @cdeszaq - 虽然“不要让事情阻止你完成它”的观点有很大的优点,但我不会将其作为避免良好实践的理由(例如保留标识符和数据作为单独的实体)。 尽可能合理地完成它可以并且确实让生活变得更容易,如果并且当你开始生产概念证明时。概念验证的一部分通常应该是软件架构。

标签: sql database database-design foreign-keys


【解决方案1】:

使用外键。如果您后来发现自己有性能问题(可衡量的问题),那么您可以将其更改为不同的。

首先让事情变得简单,然后尽快将产品送到用户手中。不要优化你无法证明需要它的东西。

【讨论】:

  • 这两个都是外键关系的例子。
【解决方案2】:

这些只是相同最终结果的不同语法。

两者都合适,但根据我的经验,前者是一种更常见的风格。这可能只是为了让人类的大脑更容易消化所有信息。首先描述数据,然后描述它与世界其他地方的关系。

不过,我想说的是,将 ID 作为唯一标识符和引用更为常见。这允许您更改名称字段中的值,而无需更改其身份并破坏参照完整性。有些数据库可以级联此类更改并更新所有出现的名称,但通常认为具有与数据分离的标识符更简洁。

【讨论】:

    【解决方案3】:

    虽然第一个选项称为out-of-line 约束声明,第二个选项称为in-line,但它们在功能上是相同的。

    最好为外键约束分配一个名称。如果您有名称,则可以根据需要选择性地启用和禁用约束。

    创建表

    CREATE TABLE arguments 
    (   
        name text UNIQUE,                         
        comment text,                         
        constraint arguments_fk FOREIGN KEY (name) REFERENCES names (name)
    ); 
    

    禁用约束

    ALTER TABLE arguments NOCHECK CONSTRAINT arguments_fk;
    

    启用约束

    ALTER TABLE arguments CHECK CONSTRAINT arguments_fk;
    

    这适用于 SQL Server。 Oracle 有等效的命令。

    【讨论】:

      猜你喜欢
      • 2015-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多