2016-01-20 58 views
-2

我一直在寻找,但我找不到任何信息。跨表的通用数据库主键

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/

+0

id bigint auto_increment主键 – SIDU

+0

@SIDU问题有点不同。我在问如何为所有的表有一个auto_increment。 – Basit

+1

请注意,大多数DBMS具有与表独立的序列生成器,因此您不需要使用自己的代码来执行此操作。 MySQL是一个例外。 – sqlvogel

回答

0

如果你需要一个全球性的BIGINT作为PK的所有表,你可能需要一个单独的表中只存储的PK?

并首先插入一条记录到这个表中以获取bigint,然后插入到成员表中。

然而,再次想到,这样做的好处是什么?

如果真要出现这种情况,一个简单的解决方案为follwoing:

有你的表的一般研究,它们是如何快速成长,然后分配BIGINT他们如:

USER_TABLE 100 - 1,999,999 photo_table 2000000 - 2,999,999 ...

当BIGINT更接近用完,派遣了一系列新的对他们来说,在表中简单地插入一个新的空白行,和BIGINT将由1从新BIGINT auto_increased值为

+0

另外还有一种方法可以做到这一点,就像我在帖子中所说的那样。这种方法可能是性能问题。这样做的原因。在网站上,您可以通过id搜索对象,并在所有表中找到唯一的id。这就是为什么Facebook使用,甚至是stackoverflow也使用。 – Basit

+0

这样做的另一个原因是,它允许对先前不同的实体集(例如客户和员工)进行超级分类,而无需重新编号现有数据或将额外信息标记到键上。 – reaanb

0

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

案例:question 771743user 771743具有相同的标识但不相关。

+1

嗯,我不太确定他们在stackflow上使用什么表。但凭借我在Facebook上的经验,他们肯定会使用它。你可以尝试一下。只是增加对象的增加值,不同的对象将被拉。有时候是它的用户,有时候是它的照片,有时是它的馈送。 – Basit