我担心我不知道自己在做什么。
我有一个名为ticket
的表,其中有一个名为total
的列。当总数更新时,我想保留它的记录(旧的总数等),所以我决定删除total
列,并创建一个名为ticket_total
的表ticket_id
列, total
和datetime
(最新的当然是“当前”总数)。
或
然后我意识到我稍后会想让我的客户能够按total
对门票进行排序,或者提取汇总总数等的报告。所以,我决定放回{{1} } total
上的列,并在更新总计时直接更改ticket
列,但首先创建total
行作为上一个ticket_total
的记录。
似乎版本2效率很高,因为我不需要同样查询相关的total
表,但我想知道你在那里想到的数据库专家。我只是在学习数据库设计,并担心我永远不会擅长它。
答案 0 :(得分:1)
我会选择你建议的选项2。
确保您在事务中执行更新(票证)+插入(在ticket_total中)以确保维护完整性。
答案 1 :(得分:1)
您的第二种选择更快,但如果您想要创建有关总计历史值的报告,您应该有一个单独的表,您可以在其中存储您要替换的值以及时间戳。此类表称为审计表。
答案 2 :(得分:1)
Re:“效率” - 最好不要在项目开始时过多担心数据库效率。过早优化是一个常见的错误。
更好的是关注您的需求并为他们设计。稍后,您可以测试是否存在性能瓶颈,并着手解决它们。
对于较小的数据库(数万行),即使是“效率低下”的查询,对于当今的服务器和软件来说,通常也会非常快。
保持简单我建议您避免使用组合键和重载表语义,除非您真的有需要。
提案您有两种类型的数据:当前故障单信息和旧“总”值的历史记录表。
所以你的第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?确保它被编入索引。
答案 3 :(得分:0)
我会将ticket_total视为一个视图,而不是一个表。我会创建另一个视图ticket_current,我将按最新日期过滤票证,即票证表是在ticket_Id和datetime上双键控制的。如果没有,请忽略最后一部分。