Mysql 数据库关系:不使用PK?
假设我有以下表格:Mysql 数据库关系:不使用PK?,mysql,database,database-design,Mysql,Database,Database Design,假设我有以下表格: Foo - id - code (Unique) - name - descption Bar - id - foo_code 指向foo.code的Bar.foo\u code是否有缺点?通常情况下,我会看到id被引用(例如,会有一个Bar.foo_id指向foo.id),但在我的例子中,如果它实际上指向的不是自动递增的PK,那么会简单得多 我很好奇这是一个糟糕的设计,还是性能会受到影响。不,没有缺点。可能取决于可读性,取决于列的真实名称。但是,请注意,如果
Foo
- id
- code (Unique)
- name
- descption
Bar
- id
- foo_code
指向foo.code
的Bar.foo\u code
是否有缺点?通常情况下,我会看到id被引用(例如,会有一个Bar.foo_id
指向foo.id
),但在我的例子中,如果它实际上指向的不是自动递增的PK,那么会简单得多
我很好奇这是一个糟糕的设计,还是性能会受到影响。不,没有缺点。可能取决于可读性,取决于列的真实名称。但是,请注意,如果Foo.code是唯一的,那么它实际上是一个主键。只需确保它也被索引,并且您是金色的。如果Foo.code实际上是唯一的,那么您甚至可以去掉Foo.id并节省一些空间。不,没有缺点。可能取决于可读性,取决于列的真实名称。但是,请注意,如果Foo.code是唯一的,那么它实际上是一个主键。只需确保它也被索引,并且您是金色的。如果Foo.code实际上是唯一的,那么您甚至可以去掉Foo.id并节省一些空间。如果您真的使用另一个键作为主键,那么您为什么要保留自动递增的
id
呢
默认情况下,表将按主键排序。默认情况下,将其按code
排序可能更有意义。另外,它需要更多的数据存储,更新速度会慢一些,因为两个索引都必须更新。对于许多应用程序来说,性能差异在实际应用中几乎没有什么区别,但是如果不使用自动增量id,我想不出有什么理由保留它
代理主键确实有其用途,但是,如果你已经有了一个唯一的列,你想用它作为主键,那么用这个唯一的列作为主键的设计一点也不坏。如果你真的用另一个键作为主键,你有什么理由要保留自动递增的
id
呢
默认情况下,表将按主键排序。默认情况下,将其按code
排序可能更有意义。另外,它需要更多的数据存储,更新速度会慢一些,因为两个索引都必须更新。对于许多应用程序来说,性能差异在实际应用中几乎没有什么区别,但是如果不使用自动增量id,我想不出有什么理由保留它
代理主键确实有其用途,但是如果您已经有一个唯一的列要用作主键,那么将该唯一列用作主键并不是一个糟糕的设计。取决于您打算如何查询:
- 如果您经常需要确定与给定的
条码关联的
条码,那么在FK中直接引用它可以有效地将其从
迁移到Foo
,这样您就可以无需加入Bar
- 但是,如果您还需要获取
或Foo.name
,那么加入是不可避免的,引用Foo.descption
可以避免付出双重查找的代价Foo.id
也就是说,您可以
Foo.id
,消除整个困境。取决于您打算如何查询:
- 如果您经常需要确定与给定的
条码关联的
条码,那么在FK中直接引用它可以有效地将其从
迁移到Foo
,这样您就可以无需加入Bar
- 但是,如果您还需要获取
或Foo.name
,那么加入是不可避免的,引用Foo.descption
可以避免付出双重查找的代价Foo.id
也就是说,您可以
Foo.id
,消除整个困境。不太可能。只要代码不改变,就可以了。塞尔科会说你的方式更好;-)如果您实际定义了外键
约束,MySQL将要求在引用的表中对该列进行索引(否则FK将出错),因此它将被执行。只要代码不改变,就可以了。塞尔科会说你的方式更好;-)如果您实际定义了外键
约束,MySQL将要求在引用的表中对该列进行索引(否则FK将出错),因此它将被执行。我确实认为Foo.id
在我的情况下是没有用的,因此可能可以安全地删除。只需检查您的数据字典。如果没有对它的引用,那么删除它是安全的。我确实认为Foo.id
在我的情况下将是无用的,所以删除它可能是安全的。只需检查您的数据字典。如果没有对它的引用,则可以安全地删除它。