【发布时间】:2012-03-12 00:14:11
【问题描述】:
我正在使用 MySQL 数据库设计一个 Web 应用程序,但我被困在我的数据库设计的一个要点上。
这是我想使用 InnoDB 引擎存储的数据类型的示例:
user_id account_id
1 1
1 2
1 3
2 1
2 2
3 1
从上面可以清楚地看出,我希望 account_id 为每个单独的用户自动递增。以下是我遇到的一些问题:
我确实知道要自动执行此操作,我可以使用 MyISAM 引擎,但在阅读了一些内容后,我意识到当更新发生时,该引擎将锁定整个表,而不仅仅是一排。这对我没有好处。此外,MyISAM 不强制执行引用完整性,我非常希望保留这一点。
我已经阅读了其他人对此问题的解决方案,他们使用了触发器。当然,我可以使用触发器,但我不是很喜欢触发器,因为它们比一个表更难维护。
我可能会使用一个序列,但我认为为每个用户维护一个单独的序列会很丑。
我可以简单地使用唯一的 AUTO_INCREMENT 而不考虑 user_id,这样会很好用。有两点我不喜欢: 1. 这样,我的 smallint 可能会增长为 int 或 bigint,这将需要更多的存储空间。我知道存储空间很便宜,但我仍然想尽量减少它。 2. 按组自动递增会更干净。
我想得到那些遇到并成功解决这个问题的用户的一些反馈/意见。也许,还有另一种我没有想到的解决方案。也许,还有另一种我没有想到的整理表格的方法。
【问题讨论】:
-
对于大约 650000 名用户,如果您从
SMALLINT移动到INT,它只会增加 1.3MB。我看不到更改为INT(或MEDIUMINT)会导致存储问题。在这里使用自动增量列是最好的主意。如果您不想锁定整个表,请尝试使用 InnoDB - IIRC 它只锁定行。
标签: mysql innodb auto-increment myisam