2009-11-13 76 views
4

什么是更好的额外查询或额外的数据库列中的数据将可用的时间更少。什么是更好的额外查询或数据库中的额外列?

例如:在子用户管理的情况下,我要在主用户表中添加一个额外的列super_user_id,如果用户类型是sub_user并且默认列值是-1,或者我创建新表并管理子用户,表。

但在登录的情况下,我不得不在两个表中搜索,我必须再做一个查询。

感谢

+2

额外的查询与额外的列,你是什么意思?你能澄清吗? – RageZ 2009-11-13 08:52:10

+1

OP在询问有关反规范化他的数据库的情况,将一些冗余信息添加为单独的列,可以通过执行额外的连接或查询来派生出*。反规范化是提高数据库查询性能的常用方法,但是如果用于创建额外列的基础数据发生更改,则需要额外的工作来保持数据完整性。 – PaulMcG 2009-11-13 09:12:05

回答

1

没有一般的答案;你必须更具体。我只能提供一般原则。

其他所有情况相同,出于多种原因,使用没有冗余信息的规范化数据库会更好。但有些情况下,冗余信息可以节省您的程序很多时间。一个例子是使用Markdown格式化的文本:您需要存储原始标记以允许进行编辑,但是每次需要输出时格式化源代码可能对系统造成极大的负担。因此,您可能会添加冗余列来存储格式化的输出,并承担额外的责任,确保该列保持最新状态。

我所知道的情况是,假设的额外列将保存查询。唯一正确的答案是,除非您知道保存一个查询的性能优势可以弥补它,否则应该保持表的清洁和最小化。请记住,过早优化是所有恶意的根源 - 您可能会发现应用程序的运行速度足够快。如果在分析时发现额外查询是一个重大瓶颈,那么您可以考虑添加该列。

同样,如果不了解您的情况,就不可能提供具体或具体的建议,但我希望我至少帮助您做出决定。

+0

Thom是正确的。你只需要减轻例如冗余数据以及它将如何进一步走下坡路。从个人的经验来看,我从大约10张桌子变成了大约6张桌子,有了一些冗余数据。它还为我节省了很多额外的编码,以便从不同的表格获取信息等等。 – Steven 2009-11-13 09:12:32

0

你的意思是计算在您的查询与存储的计算值的值?

这取决于它将被更新的频率,数据的大小以及需要的频率。可能没有理论上的最佳答案,你需要测试和分析。

-1

做额外的查询总是需要更多的时间。

在数据库中添加额外的列不会有任何重大影响,即使您应该有成千上万的行。

错误,增加额外的列和保存数据库交通:)

+2

“在数据库中添加额外的列不会产生任何重大影响” - 您是否可以用某种证据支持该声明? – 2009-11-13 08:56:56

+0

计算*可以在前端更有效地完成。 – cjk 2009-11-13 09:07:16

+0

@Dominic:什么会花最长的时间。做一个或两个查询?除非他在该额外列中存储大量数据,否则不会占用数据库的任何重要资源/空间。理论上做两个查询需要比一个更长的时间。实际上,我们可能不会注意到,因为我们正在讲话而不是分钟。 – Steven 2009-11-13 09:08:23

0

这取决于您将通过添加列来添加到表中的重定向的数量。 通过适当的索引和设计联接可以更好地工作,因此无需担心如果需要进行标准化。

0

使用第二个表。它会而不是要求您发出两个查询。相反,你会发出一个查询两个表连接在一起,或更好,创建一个视图,它的JOIN为您提供:

SELECT usertable.col1, usertable.col2 superusertable.superuserid 
    FROM usertable LEFT OUTER JOIN superusertable 
    ON usertable.userid = superusertable.userid 

这可以让你保持适当的标准化结构,帮助您在某些查询(例如查明谁是超级用户),并允许数据库优化搜索问题。

+0

但是在插入的情况下,我必须检查两个表中是否存在该用户名。 – 2009-11-13 13:25:02

+0

1)这是一个与你原来提出的问题不同的问题,它是关于查询和2)否,如果用户不在用户表中,他们不能在另一个表中有记录。您可以通过在数据库设计中声明适当的关键关系来保证这一点。 – 2009-11-13 13:34:43