1

我怕我不知道自己在做什么。

1:

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

或者

2:

然后我意识到我以后希望让我的客户能够按 排序票证total,或提取汇总总计的报告等。因此,我决定将total列放回ticket,并在总计时直接更改total列已更新,但首先创建ticket_total一行作为前一个的记录total

似乎版本 2 会非常高效,因为我不需要查询相关ticket_total表,但我想知道你们那里的数据库专家是怎么想的。我只是在学习数据库设计,担心我永远不会擅长它。

4

4 回答 4

1

我会选择你建议的选项 2。

只需确保您在事务中执行更新(票证)+插入(在票证总数中)以确保保持完整性。

于 2010-10-04T03:27:12.827 回答
1

您的第二种选择更快,但如果您想创建关于总计历史值的报告,您应该有一个单独的表,在其中存储要替换的值和时间戳。这种类型的表称为审计表

于 2010-10-04T03:36:48.280 回答
1

回复:“效率” ——最好是在项目开始时不要太担心数据库效率。过早的优化是一个需要避免的常见错误。

更好的是专注于您的需求并为他们设计。稍后,您可以测试以查看性能瓶颈是否在哪里,并努力解决它们。

对于较小的数据库(数万行),考虑到当今的服务器和软件,即使是“低效”的查询通常也会非常快。

保持简单我建议你避免组合键和重载表语义,除非你真的有需要。

建议您有两种类型的数据:当前票证信息和旧“总”值的历史表。

因此,您的版本 2 将是首选。

ticket
  id
  field_a
  field_b
  total    # current_total

ticket_total  # history of ticket total field
  id
  ticket_id
  total
  create_time

“total”听起来也像是某种东西的集合。我建议您尝试想出一个更具描述性的字段名称。-- 字段总数是多少?“总工作时间”?

添加记住为表添加索引。按您用于查找的任何内容编制索引。例如,ticket 表是否有 customer_id?确保它已编入索引。

于 2010-10-04T03:41:41.183 回答
0

我会让 ticket_total 成为一个视图,而不是一张桌子。我将创建另一个视图ticket_current,我将在其中按最新日期过滤门票,也就是说,如果门票表在ticket_Id 和日期时间上是双键的。如果没有,请忽略最后一部分。

于 2010-10-04T03:26:38.507 回答