数据库设计 - 关于效率(和一般的设计质量)问题
-
27-09-2019 - |
题
我害怕,我不知道我在做什么。
1
我有一个表称为ticket
具有称为total
柱。当总被更新我想保持它的记录(老总等),所以我决定撤销total
列,创建一个名为ticket_total
与列ticket_id
,total
和datetime
(最近的课程表是“当前” 总计)。
或
2:
然后我意识到,我稍后会想给我的客户进行排序total
门票,或聚集总数等,所以拉报表的能力,我决定,而不是放回total
列上ticket
,并改变所述total
柱直接当总被更新,但首先创建一个ticket_total
行与前面total
的记录。
看来,因为我不会需要查询相关ticket_total
表尽可能多的版本2将是高效率的,但我不知道你怎么DB大师在那里想。我刚学数据库的设计和恐惧,我永远不会成为好它。
解决方案
我会去与选项2,您所建议的。
只要确保你正在做更新的插件(的票)+(在ticket_total)的交易,以确保完整性。
其他提示
你的第二个选择是快,但如果你想创建总的历史价值报告,你应该应该有您储存你与戳一起替换值一个单独的表。这种类型的表被称为审计表
回复:“效率” - 最好是在项目开始时不要过于担心数据库的效率。过早的优化是一个常见的错误,以避免。
更好的为您的需求而设计专注于他们。后来,你可以测试是否性能瓶颈在哪里,工作解决它们。
对于较小的数据库(几万行的),甚至“低效率”的查询经常去非常快给定今天的服务器和软件。
保持简单我建议你避免组合键和重载表语义,除非你真的有需要。
建议您有两种类型的数据:目前的票务信息,并为老“总”值的历史表格
所以,你的版本2将是优选的。
ticket
id
field_a
field_b
total # current_total
ticket_total # history of ticket total field
id
ticket_id
total
create_time
同时强> “总” 的声音等的东西的聚合。我建议你尽量想出这是更具描述性的字段名。 - 什么是该领域的总的? “total_worktime”?
<强>加强>记住添加索引的表。通过什么,你使用的认定指标。如不售票台有CUSTOMER_ID?可以肯定,它的索引。
我将使ticket_total的视图,而不是一个表。我将创造另一种观点认为ticket_current在那里我会过滤由最近日期的门票,也就是说,如果票表是TICKET_ID和日期时间双重密钥。如果没有,那无视最后一部分。