and*_*112 5 mysql performance null database-design relational-theory query-performance
我正在设计一个在MySQL中使用的关系数据库。我有下一种情况:在一个表中,有些字段在大多数情况下都是NULL
. 这些字段将类似于:
Table name: tabla
Fields:
idtabla not null,
text (varchar(n)) not null,
image (mediumblob) {this can be null}
Run Code Online (Sandbox Code Playgroud)
疑问:是否最好创建另一个表,当需要使用图像时,查询新表?为什么您的解决方案更适合设计?MySQL的时间响应、查询的便捷性等?
您在这里触及了一个近乎哲学的论点:是否应该允许 NULL 值,因为它们违反了关系数据库模型的“封闭世界”假设(请参阅http://en.wikipedia.org/wiki的相关部分) /Null_(SQL)和这里的许多其他问题,例如为什么我们不应该允许 NULL?有关更多说明)。为了避免未知值将可能未知(或根本不适用于所有情况)的属性拆分为它们自己的关系(表),以便您没有未知的值,但如果值未知,则它根本不存在。虽然这满足了理论,但实际意义却使其不太理想:
JOIN
并不是免费的,在额外表中搜索属性会增加引擎满足查询所需的工作量。INSERT
或UPDATE
.当然,在某些情况下,第一点是相反的,打破属性可以提高效率:
INSERT
或中的核心信息UPDATE
,并且如果您对这些额外属性有约束或触发器,那么在每次行更改时可能会避免此处理。您的示例看起来像是在存储图像(或至少在 blob 类型列中存储大量数据)。这里有两个额外的注意事项:
SELECT *
无论如何您都会“免费”获得每页行数奖励。tl;dr:所以恐怕没有硬性且快速的答案。我的建议是做任何最适合您的数据概念模型的事情,因此您需要较少的思考来维护。这通常(但并非总是)意味着使用可为 NULL 的列而不是单独的表。除非您的数据确实很大,否则性能差异可以忽略不计。