mysql – 在关系数据库中创建另一个表可能的空值是否更好?
作者:互联网
我正在设计一个在MySQL中使用的关系数据库.我有下一种情况:在一个表中,有大多数情况下为NULL的字段.字段如下:
Table name: tabla
Fields:
idtabla not null,
text (varchar(n)) not null,
image (mediumblob) {this can be null}
疑问:最好是创建另一个表,何时需要使用图像,查询新表?
为什么您的解决方案更适合设计? MySQL的时间响应,易于查询等?
解决方法:
你在这里触及一个几乎是哲学的论点:如果它们违反了模型关系数据库的“封闭世界”假设,那么它们是否应该允许NULL值(参见http://en.wikipedia.org/wiki/Null_(SQL)的相关章节和这里的一些其他问题,如Why shouldn’t we allow NULLs?关于那个的更多说明).为了避免未知值将可能未知(或根本不适用于所有情况)的属性拆分为它们自己的关系(表),以便您没有未知的值,而是如果值未知则它根本不存在.虽然这符合理论,但实际意义却使其不太理想:
>在大多数RDBMS中,JOIN操作不是免费的,在额外表中搜索属性会增加引擎满足查询所需的工作量.
>如果属性的存在不是相关的(即每个属性都可以是未知的而不管其他属性),那么为了实现它的结论,有时你最终需要为每个属性提供一个表.
>额外的连接会增加查询的复杂性,并可能降低可维护性.
>更新也变得不那么直观:消隐属性现在变为DELETE操作,更新一个可以是INSERT或UPDATE.
当然,在某些情况下,第一点被颠倒并且破坏性能会提高效率:
>大多数RBDMS使用基于页面的存储,并从核心数据中删除可选信息意味着您可以在给定页面中容纳更多核心数据行.这取决于您的数据大小,RAM和存储基础架构,这对于减少某些大型查询所需的IO量非常重要(但通常不是:尽量不要“过度优化”这一点,至少在没有运行良好的基准测试的情况下确保事情正在改善而不是恶化).
这当然是假设您的查询被设计为只提取他们需要的内容,因此无论如何引擎都不需要关心额外信息中的绘图.
>同样,如果您只是在INSERT或UPDATE中更新核心信息,那么写入的内容就会减少,如果您有这些额外属性的约束或触发器,则可以在每次行更改时避免此处理.
您的示例看起来像是存储图像(或者至少是blob类型列中的大量数据.此处还有两个额外的注意事项:
>大多数数据库引擎无论如何都会将“大量数据”存储在“离页”中,因此如果您避免使用SELECT *,则无论如何都会“免费”获得每页行数的奖励.
>将它们移动到其他地方是否允许您在多个实体之间共享大数据,而不是多次存储相同的blob,或者是给定行唯一的信息(如果存在)?
tl;博士:所以我害怕没有硬性和快速的答案.我的建议是做最适合您的数据概念模型的事情,因此您需要更少的思考来维护.这通常(但并非总是)意味着使用NULLable列而不是单独的表.除非您的数据真的很大,否则性能差异可以忽略不计.
标签:query-performance,mysql,database-design,null,relational-theory 来源: https://codeday.me/bug/20190806/1598290.html