sql - 设计一个包含可能相互矛盾的列的数据库可以吗

标签 sql database database-design

假设我正在为一家保险公司设计一个包含以下两个表的数据库:

客户

CustomerID, CustomerName

政策

PolicyID, CustomerID, EffectiveDate, ExpirationDate

如果客户的保单有效期在今天之后,则该客户被视为“有效”。自然地,我希望构建许多查询来过滤掉不活跃的客户,反之亦然。我的争论是是否要向 Customers 表添加一个字段“Active”。

一方面,这将提高我的大量查询的性能,并且看起来更清晰、更易于理解。

另一方面,它必须每天更新。此外,客户是否被视为活跃客户完全取决于政策表中的数据。因此,通过添加“活跃”列,我正在创建一个潜在场景,其中客户被标记为活跃但他的政策数据会认为他不活跃(反之亦然)。换句话说,我正在创建一个数据可能自相矛盾的设计。

这是不好的做法吗?

最佳答案

正如 duskwuff 所说,这是一种常见的做法。

但是,非规范化会产生一些成本 - 您必须想出一种替代方法来使“事件”列保持最新,并且该过程会引入更多代码,因此有可能失败。

一般来说,我强烈建议仅在您知道存在性能问题时才进行反规范化。在您达到数亿条记录之前,Policies 表的附加连接几乎肯定不会对您的系统性能产生可衡量的影响。如果你担心,建立一个测试数据库并使用像 DBMonster 这样的工具用测试数据填充它,并编写你需要的查询;尽可能地优化它们,只有当你不能获得你需要的性能程度时,你才应该考虑去规范化。

关于sql - 设计一个包含可能相互矛盾的列的数据库可以吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17284595/

相关文章:

mysql - 从 mysql 中的同一字段获取两种状态的值

mysql - 我刚开始使用 MYSQL,但无法找到语法错​​误

mysql - 如何从一个月前的数据库中获取值而忽略当前日期的某些天数?

新闻存档的 PHP/MYSQL 年月表

php - 以 0 开始表的 ID 列有什么缺点吗?

ios - 如何在 fmdb 数据库中使用 limit 和 order by 子句来检索表数据?

mysql - 如何在mysql查询中应用GROUP_CONCAT

php - mysql中的类别显示一次

php - 在来自 Laravel 数据库的字符串数据中添加换行符

c# - 使用 C# 将数据传入和传出 SQL 表