跨表的通用数据库主键

时间:2016-01-20 00:27:11

标签: mysql sql database database-design doctrine

我一直在搜索,但我找不到任何关于此的信息。

stackoverflow或facebook如何在那里生成BIGINT id?它们在所有表格中始终是唯一的。

例如:

id  |   table
1       user table
2       photo table
3       feed table
4       user table <... next was 4 and not 2

这是否有任何文件?我认为不会有两个插入来保存每个表类型的记录,然后将id分配给表,因为这会减慢插入过程,对性能也是如此。

还有其他例子可供使用:

https://www.percona.com/blog/2008/04/02/stored-function-to-generate-sequences/ http://devzone.zend.com/1786/mysql-sequence-generator/

2 个答案:

答案 0 :(得分:0)

如果你需要一个全局bigint作为所有表的pk,你可能需要一个单独的表来存储pk?

并首先在此表中插入记录以获取bigint,然后插入到成员表中。

然而,在第二个想法中,这样做的好处是什么?

如果您真的希望这种情况发生,可以采用以下简单的解决方案:

对你的表进行一般性研究,他们的成长速度有多快,然后为他们分配bigint,例如:

user_table 1,000,000 - 1,999,999 photo_table 2,000,000 - 2,999,999 ...

当bigint接近耗尽时,只需在表中插入一个新的空白行就可以为它们分配一个新的范围,bigint将从新的bigint值中自动增加1

答案 1 :(得分:0)

通常你没有。而且不想。当你说stackoverflow和facebook生成的id在所有表中始终是唯一的时,你就会做出一个假设。这是一个不正确的假设。仅仅因为一个id用于users表并不意味着相同的数字不能用于问题表中完全不相关的问题id。 id在它们自己的表的上下文中是唯一的,但它们并不强制它在每个表中都是唯一的。

案例:question 771743user 771743具有相同的ID,但不相关。