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
在我的情况下将是无用的,所以删除它可能是安全的。只需检查您的数据字典。如果没有对它的引用,则可以安全地删除它。