我正在设计一个在MySQL中使用的关系数据库。我有下一种情况:在一个表中,大多数情况下的字段是NULL
. 字段将如下所示:
Table name: tabla
Fields:
idtabla not null,
text (varchar(n)) not null,
image (mediumblob) {this can be null}
疑问:最好创建另一个表,并在需要使用图像时查询新表?为什么您的解决方案更适合设计?MySQL的时间响应,易于查询等?
我正在设计一个在MySQL中使用的关系数据库。我有下一种情况:在一个表中,大多数情况下的字段是NULL
. 字段将如下所示:
Table name: tabla
Fields:
idtabla not null,
text (varchar(n)) not null,
image (mediumblob) {this can be null}
疑问:最好创建另一个表,并在需要使用图像时查询新表?为什么您的解决方案更适合设计?MySQL的时间响应,易于查询等?
您在这里触及了一个几乎是哲学的论点:是否应该允许 NULLable 值,因为它们违反了模型关系数据库源自的“封闭世界”假设(参见http://en.wikipedia.org/wiki的相关部分/Null_(SQL)和这里的许多其他问题,例如为什么我们不应该允许 NULL?为避免未知值将可能未知(或根本不适用于所有情况)的属性拆分为它们自己的关系(表),这样您就没有未知的值,而是如果值未知,则它根本不存在. 虽然这满足了理论,但也有一些实际意义使其不太理想:
JOIN
操作不是免费的,在额外的表中搜索属性会增加引擎为满足您的查询而需要做的工作。INSERT
或 anUPDATE
。当然,在某些情况下,第一点是相反的,打破属性会提高效率:
这当然是假设您的查询是经过设计的,因此它们只获取他们需要的内容,因此引擎无论如何都不需要关心额外信息中的绘图。
INSERT
or中的核心信息UPDATE
,并且如果您对这些额外属性有约束或触发器,则可能会在每次行更改时避免此处理。您的示例看起来像是在存储图像(或至少在 blob 类型列中存储大量数据。这里有两个额外的注意事项:
SELECT *
你都会“免费”获得每页行数的奖励。tl; dr:所以恐怕没有硬性和快速的答案。我的建议是做任何最适合你的数据概念模型的事情,因此你需要更少的思考来维护。这通常(但并非总是)意味着使用 NULLable 列而不是单独的表。除非您的数据确实非常庞大,否则性能差异将可以忽略不计。
单独的图像表是否有用取决于图像与原始表中其余属性之间关系的基数:
如果满足以下任一条件,则单独的图像表是合理的:
如果图像每行都是唯一的,我不会担心空字段,因为在这些情况下,如果使用单独的图像表,您将拥有空外键。
SELECT *
如果您决定将图像保留在原始表中,则仅在需要时检索它们可能是有益的(与任何数据一样,因此除非您需要所有可用数据,否则最好不要使用)。如果您创建一个新表,那么您可能需要一个“JOIN”来获取图像数据。连接会降低 RDBMS 的性能。但是在您的情况下,因为只有一个连接,所以它不会对整体查询性能产生太大影响。