我有一个用于存储优惠券/折扣的表格,我希望使用coupon_code列作为主键,它是一个 VARCHAR
类型。
我的理由是每个优惠券都将有一个唯一的代码,并且我将运行的唯一命令是 SELECT ... FROM ... WHERE coupon_code='..'
我不会做任何连接或索引操作,我认为在这个表中不会有超过几百条记录。
在我看来,这样做应该是可以的,但我不知道是否有任何我遗漏或没有考虑到的问题。
我有一个用于存储优惠券/折扣的表格,我希望使用coupon_code列作为主键,它是一个 VARCHAR
类型。
我的理由是每个优惠券都将有一个唯一的代码,并且我将运行的唯一命令是 SELECT ... FROM ... WHERE coupon_code='..'
我不会做任何连接或索引操作,我认为在这个表中不会有超过几百条记录。
在我看来,这样做应该是可以的,但我不知道是否有任何我遗漏或没有考虑到的问题。
一概而论"不应该这样做"是可怕的建议。根据您的用例、工作负载、数据熵、硬件等情况,在许多情况下这是完全合理的。您不应该做出假设。
需要注意的是,您可以指定一个前缀来限制MySQL的索引,从而在扫描其余部分之前有所帮助,缩小结果范围。然而,随着前缀的“填满”和变得不太唯一,这可能会变得越来越不实用。
这很简单,例如:
CREATE TABLE IF NOT EXISTS `foo` (
`id` varchar(128),
PRIMARY KEY (`id`(4))
)
还要注意,前缀(4)
出现在列引用后面。其中4
表示应该使用128个可能字符中的前4个字符作为id
。
最后,在使用索引前缀之前,您应该先了解它们的工作原理和限制: https://dev.mysql.com/doc/refman/8.0/en/create-index.html
这取决于具体的使用情况。
如果您的表是静态的,并且只有短列表的值(并且在数据库的生命周期内几乎不可能更改),我建议使用以下结构:
CREATE TABLE Foo
(
FooCode VARCHAR(16), -- short code or shortcut, but with some meaning.
Name NVARCHAR(128), -- full name of entity, can be used as fallback in case when your localization for some language doesn't exist
LocalizationCode AS ('Foo.' + FooCode) -- This could be a code for your localization table...
)
没问题,只有几百条记录的话速度会很快。
你可以添加一个唯一的id作为主键(int自增),并将coupon_code设置为唯一。因此,如果您需要在其他表中进行请求,最好使用int而不是varchar。