数据库设计:更新表的问题

时间:2011-09-01 11:07:41

标签: sql database

我在设计db表时遇到问题。在这里解释我的问题是一个简单的论坛数据库。 论坛表包含以下列:

|  forum_id  |    title      |     desc     |   last_update    |
------------------------------------------------------------
|      1     |    'title'    |    'desc'    |    2011/5/3      |

现在,当我设计这个表时,我是否应该允许title,desc和last_update列的空值?

如果我从逻辑上思考,论坛应始终具有title和desc列的值,而last_update列可以为null或不为null但如果用户尝试更新title列,则他/她还必须提供desc值。所以这不好,因为通过这种方法,我们必须找到我们正在编辑的论坛的desc值并将其再次传递给sql语句,这将导致已经存在的不必要的值覆盖!

问题1:另一方面,如果我为每个更新语句声明了单独的sps(每个列更新一个)并且我的表足够大那么这将导致db充满sps,基本上做同样的事情同桌上的东西。

问题2:如果我允许空值,那么像这样的更新将损害我的数据完整性:

update ForumDB(title, desc, last_update) 
values ('edited title', null, 2011/6/4)
where forum_id = 1

那么可以做些什么来防止这两种副作用?

2 个答案:

答案 0 :(得分:3)

我同意Nivas的说法,听起来这些列不应该是可空的,因为您应该强制执行以下规则:如果没有这两个强制值,就无法创建论坛。

无论如何你的问题2听起来你绝对不想在任何情况下禁止更新null

因此,你可以拥有一个接受所有参数的通用UPDATE过程,并将NULL参数解释为保留原始值。

SET title = COALESCE(@title, title), 
    Desc= COALESCE(@Desc,Desc)

您需要检查RDBMS中这些非更新更新是否存在性能影响。 For SQL Server some information on this can be found here.

答案 1 :(得分:3)

数据库旨在保存数据,这是数据库的唯一目的(绝不是一项小任务)。数据是应用程序中最重要的部分之一(如果不是 最重要的部分)。

所以你做了一些不会损害数据完整性的事情(任何)。

如何访问,更新方式相对不如数据完整性重要。它们总是可以进行优化。您不能妥协数据完整性。 (如果您想要了解如何优化的一些指示,您必须指定您正在使用的技术以及您正在遵循/计划遵循的方法)

所以:您不允许titledesc列的空值。

问题2实际上根本不是问题:更新数据库的存储过程的大小(如果这是SP的意思)不依赖于数据量。即使你有一个庞大的表,你仍然只有一个(或一堆)存储过程来操纵数据。

问题2 可以通过多种方法解决,具体取决于您使用的技术。即使您有一百列,您的应用程序也不会有一百个不同的操作,每个操作都有一列。列按逻辑分组,每次更新时更新一组。对于每列,您绝对不需要单独的过程。

您的 应用程序架构和设计 非常重要。让我们看一个简单的场景:一个UI,您可以在其中查看论坛的名称和描述,并更新它们。

您担心用户可能只想更新标题,为此您必须获取最新描述并更新它们。

但为什么?

无论如何都必须提取它们。要显示它们。您可以使用相同的值进行更新。所有你必须确保的是,其他人还没有更新列,你正在覆盖它们。您可以使用modified_by列检查您拥有的数据是否是最新数据。 (除了日期之外,此列应该保留时间的原因之一)。

有关类似主题的讨论,请参阅Should you enforce constraints at the database level as well as the application level?