我推荐的设计类似于我在面向对象语言中的做法。这将产生潜在复杂连接的开销和多个表的开销。我会像这样布置我的数据库:
Table GeneralTickets
(
ticket_id number,
customer_id number,
... other fields that are **common to all tickets**
)
Table ComplaintTickets
(
complaint_id number,
ticket_id number (FK to GeneralTickets#ticket_id),
product_id number,
... other fields
)
Table FeatureTickets
(
feature_id number,
ticket_id number (FK to GeneralTickets#ticket_id),
... other fields
)
在这种情况下,No-SQL 解决方案不是您要寻找的,因为这个问题 1) 更适合关系数据库,2) 我非常怀疑您记录的数据量与 No-SQL 解决方案一样多。
更新
在报告功能方面,我仍然坚持使用关系数据库。您基本上有一个需要解决的数据仓库问题。您想要做的是拥有一系列基表(这些将是最终构建您的报告的表)。从这些基表中,您将创建所谓的materialized views
. 这些materialized views
将处理给定时间范围内的所有数据(即您的一月份报告)。
正如您所说,复杂联接和多个表的开销是我考虑 No-SQL 解决方案的主要因素。SQL 解决方案会增加维护并降低性能。我认为,工单系统与其他系统没有紧密绑定,对于产品详细信息或客户详细信息等其他详细信息,我们可以从 SQL DB 同步更改事件。你能解释一下你如何看待第二个问题吗?
现在到你留下的评论。只有写得不好的 SQL 才会变慢,这就是笛卡尔连接和简单索引查找之间的区别。维护在所有这一切中都只占很小的一部分。但是,如果没有看到您的域对象(在您处理结果集后初始化的类),我就无法谈论维护方面。您的域可能需要修改为比现在更正确(不是说它不正确,只是它可能更正确)。保持多个系统同步将是您最不想做的事情之一。