数据库设计 - 关于效率的问题(和一般设计质量)

时间:2010-10-04 03:11:33

标签: database-design database-performance

我担心我不知道自己在做什么。

1

我有一个名为ticket的表,其中有一个名为total的列。当总数更新时,我想保留它的记录(旧的总数等),所以我决定删除total列,并创建一个名为ticket_total的表ticket_id列, totaldatetime(最新的当然是“当前”总数)。

2:

然后我意识到我稍后会想让我的客户能够按total对门票进行排序,或者提取汇总总数等的报告。所以,我决定放回{{1} } total上的列,并在更新总计时直接更改ticket列,但首先创建total行作为上一个ticket_total的记录。

似乎版本2效率很高,因为我不需要同样查询相关的total表,但我想知道你在那里想到的数据库专家。我只是在学习数据库设计,并担心我永远不会擅长它。

4 个答案:

答案 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上双键控制的。如果没有,请忽略最后一部分。