1
3
这是一个自然键变坏的例子,在我的书中varchar(128)对于PK来说太大了。它迫使你在评审表中有一个大的fat(非常宽的)PK或index。我会这样做:
您可以考虑进行PK:ProductID+UserID+ProductSourcID。但是,如果您需要FK到另一个表中的Reviews,那么您需要在ProductID+UserID+ProductSourcID之间拖动。我更喜欢FK来复习。 在任何情况下,int+int+int自动递增ProductID+UserID+ProductSourcID在磁盘存储和缓存使用方面都比char(14)+varchar(128)+varchar(128)版本要好得多。对于数据库来说,使用和存储固定宽度的int+int+int索引值比char(14)+varchar(128)+varchar(128)版本要容易得多。 此外,通过使用自动增量PKs,用户可以更改他们的用户名(结婚/离婚),而不是破坏所有的FKs。它将强制所有ProductSource值标准化,而不是自由文本,无法加入。 编辑 根据OP的评论:
我不知道身份证是怎么让插入复杂化的。但是,如果您不能/不愿意更改其他表的PKs,那么哈希是最好的方法,但我不会将其作为PK。千万不要让散列成为PK,可能会发生冲突,阻止插入合法数据。使用auto generate INT作为PK并添加一个哈希列。你应该这样做。在Reviews中创建一个名为“ReviewHash”的新列,并向其中添加一个索引,如果预期会发生许多冲突(多个不同的行具有相同的哈希值),则可以将productid、user和source列包含为“covered columns”。另外,做
如果您执行以下查询:
那么就不能使用索引,查询必须应用
|
Michael Samuel · MYSQL在以下情况下自动创建索引 6 年前 |
Patricia Rozario · 数据库设计确保一对一关系 6 年前 |
dryhay · MySQL“多对多”关系错误 6 年前 |
L. Fox · 我在这里用的是什么样的Laravel雄辩的关系 6 年前 |
Geoff Harper · 我应该如何构建关系松散的SQL db 6 年前 |
waroxx · SQL—当多个表具有相同的列时,最好怎么做 6 年前 |
Lumpi01 · SQL 2不同的注释类型-最佳解决方案? 6 年前 |
Hayreddin Tüzel · 预约系统数据库建模[关闭] 6 年前 |