我是数据库设计的新手。
Somethings我有一个[一对多]关系用于php加载。例如,表格"ForumPost"
和"ForumPostAttachment"
。其中每一个" post"记录可以有零到多个"附件"。
虽然很多时候"post"
可能只有"attachment"
,但我不知道该程序总是浪费一个查询来从"ForumPostAttachment"
中选择,检查帖子是否有附件。如果是,请将附件数据添加到数组中,但如果不是,则不会执行任何操作。
所以,如果我在"ForumPost"
中添加一个名为"hasAttach"
的列来存储一个值(可能是0或1)。所以从"ForumPost"
中选择之后,我可以简单地使用{{在php中,只进行第二次查询f "if"
。我认为这会节省一些资源。但是,我在例子中没有看到这个,我不知道它是好还是傻,请给我一些建议。
对不起如果这是一个主要基于意见的",但任何帮助都将是感谢。
编辑:
感谢尼克的评论。我问这个问题的一个原因是我被告知"较少的查询是好的"。但不知何故,是否通过使用额外查询进行大量检查?
答案 0 :(得分:1)
您正在描述非规范化的形式 - 您正在引入冗余副本 1 数据以加速查询。
但是,正如其他人已经暗示的那样,您可能会冒这两个副本不同步的风险,并且有效地破坏了数据。在并发环境中,独立并发事务可能会修改另一个副本,很容易不要小心并放弃正确的并发控制(例如锁定),导致难以重现竞争条件
因此,数据库设计的总体目标是归一化 2 ,而不是非规范化。非正规化应该非常谨慎地使用,只有在之后对现实数据量进行测量并得出结论,这绝对是必要的性能。
在您的情况下,非正规化不太可能是必要的。我怀疑直接查询 3 可能会正常工作,假设为proper indexing / clustering。
1 术语" copy"在这种情况下,不应该太字面意思。从本质上讲,每当你可以从其他数据中推断出一段数据时,你就会制作一个" copy",即使它有一个不同的'#34;形状"。
2 I.e。删除冗余,从而消除破坏数据的机会。换句话说:如果可以推断某些内容,则不应存储它。
3 或LEFT JOIN如果你想处理多个帖子,正如评论中已经暗示的那样。