SQL,两张表,一张共享主键

Posted

技术标签:

【中文标题】SQL,两张表,一张共享主键【英文标题】:SQL, two tables, one shared primary key 【发布时间】:2012-09-11 15:45:20 【问题描述】:

我想要两个表,这样我就可以将旧记录移动到第二个表中,这样我就可以保持主表很小,但仍然希望能够使用一个 int 主键链接到两个表。

例如: (我已经根据我的真实表中的内容简化了这个示例)我正在跟踪会话并希望将过期的会话移动到 Expired_Sessions 表中,但我还将会话链接到像 Login_Attempts 表这样的日志表,我不想要断开这些表的链接。

Sessions
--------------------
PKey       | int
Session_ID | varchar


Expired_Sessions
--------------------
PKey       | int
Session_ID | varchar

Login_Attempts
--------------------
Session_FKey | int
Count        | int

我确实想到了两种可行的方法,但我认为应该有更好的方法来做到这一点?

一个:在我的 sys_constants 表中存储一个主键计数器,并在每次添加记录时递增它。 或

二:添加另一个表,将会话表主键和过期会话主键链接到第三个主键,然后使用第三个主键链接到我的日志表。

【问题讨论】:

您使用的是哪个 DBMS?甲骨文? PostgreSQL? DB2? 【参考方案1】:

您是否考虑过使用表分区?我不太了解您的要求,但可能值得调查。

当表和索引变得非常大时,分区可以通过以下方式提供帮助 将数据划分为更小、更易于管理的部分。这 论文侧重于水平分区,其中大组 行将存储在多个单独的分区中。的定义 分区集是根据您的需要定制、定义和管理的。 Microsoft SQL Server 2005 允许您根据以下条件对表进行分区 使用定义的范围或列表的特定数据使用模式。 SQL 服务器 2005 年还为长期管理 通过添加设计的功能分区表和索引 围绕新的表和索引结构。

http://msdn.microsoft.com/en-us/library/ms345146(v=sql.90).aspx

【讨论】:

【参考方案2】:

为什么不为每个表保留单独的主键,而是添加另一列作为会话的唯一标识符,无论它位于哪个表中?我看到你有 Session_ID...如果你索引它,你甚至可以用它来查找。

【讨论】:

以上是关于SQL,两张表,一张共享主键的主要内容,如果未能解决你的问题,请参考以下文章

字段属性--主键

hibernate一对一关联

如何分清SQL数据库中的主键与外键

SQL查找两张表主键相同的数据

SqlServer2008 如何判断一张表的数据不在另外两张表里且在该表中新建一列显示状态

怎样用Sql语句判断一张表中的两条数据相同