Sql 创建表时在何处声明外键?
我想设计一个名为Sql 创建表时在何处声明外键?,sql,database,database-design,foreign-keys,Sql,Database,Database Design,Foreign Keys,我想设计一个名为arguments的表,它的一个属性name链接到名为names的表中的另一个属性name 我看到了两种用SQL表示的方法: 通过在表上创建约束: 创建表名(名称文本唯一, 短文本唯一, 评论文本); 创建表参数(名称文本唯一, 评论文本, 外键(名称)引用名称(名称)); 通过动态限定属性: 创建表名(名称文本唯一, 短文本唯一, 评论文本); 创建表参数(名称文本唯一引用名称(名称), 评论文本); 我想知道: 如果通常认为两者中的一个优于另一个,以及 如果它能产生我应
arguments
的表,它的一个属性name
链接到名为names
的表中的另一个属性name
我看到了两种用SQL表示的方法:
创建表名(名称文本唯一,
短文本唯一,
评论文本);
创建表参数(名称文本唯一,
评论文本,
外键(名称)引用名称(名称));
创建表名(名称文本唯一,
短文本唯一,
评论文本);
创建表参数(名称文本唯一引用名称(名称),
评论文本);
- 如果通常认为两者中的一个优于另一个,以及
- 如果它能产生我应该意识到的后果
谢谢您的帮助。使用外键。如果您后来发现您有一个性能问题(一个可测量的问题),那么您可以将其更改为不同的
首先要保持简单,尽快将产品送到用户手中。不要优化你无法证明需要的东西。对于相同的最终结果,这些只是不同的语法 两者都是合适的,但在我的经验中,前者是更常见的风格。这可能只是为了让人类的思维更容易消化所有信息。首先描述数据,然后描述它与世界其他地区的关系
不过,我要说的一点是,将ID作为唯一标识符和引用更为常见。这允许您更改名称字段中的值,而无需更改其标识和破坏引用完整性。有一些数据库可以级联此类更改并更新名称的所有引用,但通常认为更干净的做法是使用与数据分开的标识符。而第一个选项称为
越行约束声明,第二个选项称为内行,两者在功能上是相同的
最好是为外键约束指定一个名称。如果您有一个名称,您可以根据需要有选择地启用和禁用约束
创建表
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;
启用约束
ALTER TABLE arguments NOCHECK CONSTRAINT arguments_fk;
ALTER TABLE arguments CHECK CONSTRAINT arguments_fk;
这是针对SQL Server的。Oracle有相同的命令。您使用的是什么RDBMS?MySQL?SqlServer?等等?使用文本数据作为键是一种不好的做法。您的名称表应该有一个ID列,这将成为任何引用的FK。@cdeszaq我使用的是SQLite(用于概念证明)。如果这只是概念证明,那就没关系了。完成证明,然后进行实际工作。不要浪费时间解决目前不存在的问题。@cdeszaq-尽管“不要让事情阻止你去完成它”的观点有很大的优点,但我不会把它作为避免良好实践的理由(例如将标识符和数据作为单独的实体)。如果你开始将概念证明产品化,那么尽可能地做好这件事可以并且确实会让生活变得更加轻松。概念验证的一部分通常应该是软件架构。这两个都是外键关系的示例。