6

我设计了我的数据库,并使用 varchar 来制作唯一的名称。我做了一个表 products ,每个产品都有一个产品代码,这个代码是唯一的,不能重复,主要是我在父表中的主键。这个想法是,例如我有一支蜡烛,蜡烛有不同的颜色,所以不同的产品,我可以通过产品代码来区分产品名称。我没有使用或将表命名为 int 类型的可索引 id,并且在插入新项目时它会自动递增。我只是将唯一代码用作外键上其他表的索引器。

我不知道这是否是个好主意,我对 PHP MySQL 很陌生,在将值插入不同的表时遇到了一些问题,所以我使用产品代码将它们链接起来。现在我只知道 mysqli_insert_id 很久以前可以解决我的问题的东西。

那么我可以只使用字符串的非标准行ID而不是int类型的行ID吗?

4

6 回答 6

11

就我个人而言,我会说使用汽车公司 ID。使用您的产品代码作为 ID / 主键意味着您以后不能(或将更难)更改产品代码,这可能会导致问题。

详细说明:

如果您最终扩展您的数据库以便您的产品链接到不同的表,使用产品代码作为您的 ID 意味着如果您想更改您的产品代码,您将必须更新所有表中的每个条目。使用不是产品代码的 ID 意味着您只需在一个位置(库存表)更新代码,当您加入库存表以获取产品代码时,ID 将完成其余的工作。

于 2013-02-15T15:13:11.427 回答
5

字符串 ID 的一大缺点是它会使索引(很多)变大,这可能会影响性能。

我会保持简单,并使用标准的自动增量 int。

我也同意@hd1 和@webnoob 的回答——行ID 应该是恒定的并且独立于它所描述的值——经典错误(在我看来)行ID 是美国SSN 或政府分配给人或公司的任何其他唯一编号.

于 2013-02-15T15:15:50.740 回答
3

任何唯一的 [和理想情况下不变的] 值,一组值都可以用作数据库中的键/主键。代理键 [例如:自动增量 INT 列] 在 mySQL 中如此常见的主要原因是:

  1. 很长一段时间以来,外键都是不可行的,[InnoDB 直到最近才变得可用] 并且在没有它们的情况下在多个表之间保持字符串键同步是一场噩梦。
  2. 字符串列上的索引具有长度,并且可以比列本身短。这样您可以保持索引紧凑,但也可能导致问题。例如:name长度为 5 的列上的键与名称冲突Tom CruiseTom Clancy因为键是Tom C.
于 2013-02-15T15:30:06.340 回答
2

只要我们有关系数据库,自然键与代理键的优缺点就会继续争论不休。我说:做你喜欢的事,但如果你要使用代理,尽量确保,在可能的情况下,还有一种通过自然键唯一标识行的方法。

于 2013-02-15T15:24:20.283 回答
1

字符串需要被解析为相等(查询、连接等)。因此,存在性能影响。这意味着你应该尽可能避免它。

于 2013-02-15T15:18:08.727 回答
0

可以做到,但仅仅因为你可以,并不意味着你应该。理论上,主键在数据库之外不应该有任何意义。根据定义,产品代码在数据库之外具有意义。

于 2013-02-15T15:14:42.530 回答