活动数据结构 - 此模型(或类似)是否已存在?

时间:2009-09-04 17:42:19

标签: sql database-design

活动数据结构

这个概念是......

你有一张桌子(一张有很多记录的桌子)..

[data1] (call this the 'active' table)
---------
Data1ID (required)
SysID (required)
createdDate (required)
lastUpdatedDate (required)
[mydata] (user's fields)

您还有n个表与Data1保持相同的列。

[data2] (call these the 'inactive' tables)
---------
Data2ID (req.)
SysID (req.)
createdDate (req.)
lastUpdatedDate (req.)
[mydata] (user's fields)

...

[data(n)]
---------
Data(n)ID (req.)
SysID (req.)
createdDate (req.)
lastUpdatedDate  (req.)
[mydata] (user's fields)

当用户查询记录时,会激活触发器 启动搜索在Data1上发生(“活动”表) 如果找不到记录,它会检查“非活动”表 下订单。

如果在“非活动”表格中找到记录, 该记录将从该表中删除并插入 Data1('有效'表)。

新记录进入“有效”表格。

在共享sysid的表之间永远不会有冗余记录。

每日工作

  • 为每个表分配一个“期限”日期范围:

数据1:现在 - 过去3个月 数据2:3个月 - 6个月
数据(n):最后定义之前的任何内容等。

  • 任何行修改都会根据“有效”表格应用于“非活动”表格。

  • “活动”表中位于“非活动”表的“术语”内的lastUpdatedDate的任何记录都将从“活动”表中删除,并移至相应的“非活动”表。非活动表格也会在相同的情况下进行检查。

优势

我的想法是,这种结构可以很容易地添加到现有的 膨胀的表,加快查询性能,同时具有可扩展性 解决方案只需重新定义“术语”范围并添加“非活动”表格即可。

问题..

搜索非活动数据显然需要更长的时间。

2 个答案:

答案 0 :(得分:1)

这称为sharding。 SQL Server支持称为水平分区的东西,它可以做这种事情。你可以自己动手,或者你可以使用像NHibernate这样透明地做到这一点。

您无法在select语句上运行触发器。您可以创建一个视图或使用一个处理数据库查询的服务/存储库,并继续搜索直到您找到匹配项,但我会考虑使用NHibernate或已经有一些测试支持的东西。

答案 1 :(得分:0)

看起来像滚动你自己的分区。我建议您查看RDBMS供应商提供的分区选项。它们并不完全适合这种情况,但在大多数情况下你可能会发现允许分区修剪的东西。

其他问题

如果要在select上将数据从非活动状态移动到活动“分区”,则选择将不得不减慢以进行数据修改。

数据修改往往需要更重的锁定然后阅读。以Oracle为例。两个查询正在尝试读取相同的记录。通常两者都只是读取值,但是使用这种方案,不是只读取记录,而是通过在表之间移动来尝试修改,而另一个将阻止另一个。