我应该创建一个新的DB列吗?

时间:2011-01-04 16:54:27

标签: sql mysql database database-design

我不知道在我的Mysql数据库中创建新列是否更好。

我有一张桌子:

  

calculated_data   (id,date,the_value,status)

status是一个布尔值。

我需要一个名为the_filtered_value

的额外值

我可以很容易地得到它:

  

SELECT IF(status IS FALSE,0,the_value)AS the_filtered_value FROM calculated_data

calculated_data表有数百万个条目,我在图表和数据表中显示the_valuethe_filtered_value(使用php)。


the_filtered_value表格中创建新列calculated_data或仅使用SELECT IF查询是否更好?

在“更好”中,我看到:

  • 表现更佳
  • 更好的数据库设计
  • 更易于维护
  • ...

感谢您的帮助!

3 个答案:

答案 0 :(得分:3)

不要添加列。而是根据原始数据表创建一个VIEW,并在视图中根据您的表达式添加一个名为the_filtered_value的“虚拟”计算列。

通过这种方式,您可以轻松访问过滤后的值,而无需将该表达式的“逻辑”复制到代码中的不同位置,同时不会存储任何派生数据。此外,您可以直接在视图上操作,就像在大多数情况下它是一个表格一样。

 CREATE VIEW calculated_data_ex (id, date, the_value, status, the_filtered_value)
   AS SELECT id, date, the_value, status, IF(status IS FALSE, 0, the_value)
      FROM calculated_data

答案 1 :(得分:0)

添加额外字段会增加应用程序的复杂性,但会使查询更容易(特别是在其他表上加入时)。

我个人总是试图将数据尽可能地分开保存在数据库中,并在我的应用程序中处理这种情况。使用MVC模式可以使这项任务更容易。

答案 2 :(得分:0)

这适用于MS SQL,但我不知道MySQL是否支持语法。

declare @deleteme table (value int, flag bit)
insert @deleteme
Values
(1,'False')
,(2,'true')

Select *, (flag*value) AS the_filtered_value from @deleteme