新表或新列

cur*_*grr 3 database-design

如果这是一个愚蠢的问题,请提前道歉。

背景:我是一名实习生,我的任务是为公司客户管理系统添加一个新功能。基本上它涉及“清除”订阅,他们希望从客户端管理系统中删除选定的订阅,但保留在数据库中以进行记录。我们目前有大约 600,000 个订阅。他们希望立即“清除” 10,000 个订阅,并在接下来的几个月内再“清除” 30,000 个,因此大约 6% 的订阅表。

我想知道的是实现这一目标的最佳方法是什么。我想出了两个选择;

a) 向数据库添加一个新表以存储具有 3 列的“已清除”订阅,purgedId、subscriptionId(引用订阅的 fk)和 purgedDate。然后在任何引用订阅表的 sql 中,左外连接已清除的表并使用“where purgedId = null”。

b) 向订阅表添加一个新列以存储清除日期,并将“where purgedDate = null”添加到我的所有订阅 sql 中。

选项 a) 似乎是一种浪费,添加一个全新的表来基本上存储一个属性。选项 b) 似乎是一种浪费,添加一个仅被表中 6% 的行使用的列。

另一方面,外部左连接是排除已清除订阅的最佳方法吗?

预先感谢您提供的任何帮助,如果这是一个基本问题,再次抱歉。

JNK*_*JNK 7

我会选择选项 3,这将需要较少的整体工作:

  • 制作一个包含已清除记录和日期列表的查找表,就像在您的第一个选项中一样
  • 将您当前的表重命名为类似 dbo.Tablename_master
  • 创建一个包含以下内容的VIEW命名dbo.Tablename

.

SELECT <fields>
FROM dbo.Tablename_Master
WHERE PrimaryKeyField NOT IN (SELECT PrimaryKeyField FROM PurgeTable)
Run Code Online (Sandbox Code Playgroud)

现在您不需要修改任何现有代码,因为对原始表的所有引用都通过视图。如果您有任何现有约束,这将很复杂,但它们应该很容易解决。