【发布时间】:2018-09-19 23:22:43
【问题描述】:
根据我的理解——如果我错了请纠正我——“规范化”是从数据库设计中删除冗余数据的过程
但是,当我尝试了解数据库优化/调优以提高性能时,我遇到了 Mr. Rick James 建议反对规范化连续值,例如(INTS、FLOATS、DATETIME,...)
“标准化,但不要过度标准化。”特别是,不要标准化 日期时间或浮点数或其他“连续”值。
当然,纯粹主义者会说时间标准化。这是一个很大的错误。一般来说, “连续”值不应标准化,因为您通常 想要对它们进行范围查询。如果归一化,性能 会差几个数量级。
标准化有几个目的;它们在这里并不真正适用:
节省空间——一个时间戳是 4 个字节;用于标准化的 MEDIUMINT 为 3;节省不多
允许更改通用值(例如,在一处将“International Business Machines”更改为“IBM”)——此处不相关;每个 时间是独立分配的,你不是时间领主。
对于日期时间,规范化表可能有额外的列,如“星期几”、“一天中的小时”。是的,但性能仍然 糟透了。
不要规范化“连续”值——日期、浮点数等—— 特别是如果您要进行范围查询。
我试图理解这一点,但我无法理解,有人可以向我解释一下,并举例说明应用此规则会提高性能的最坏情况吗?
注意:我本可以在评论或其他内容中询问他,但我想单独记录并强调这一点,因为我相信这是非常重要的说明,几乎影响了我的整个数据库性能 p>
【问题讨论】:
-
你能引用一本可信的教科书,将数据库规范化定义为用 ID 号替换文本吗? (不,你不能。)规范化永远不会引入新属性。
-
属性
schools.id是新的。 -
PS RickJames 似乎不知道什么是“标准化”。他们似乎认为这与用 id 替换值有关。它们似乎也意味着用与其结合的值替换一个值,这确实与“1NF”的某些概念有关,但与更高 NF 的规范化无关。无论如何,'不要规范化“连续”值'太短了,无法表示任何意思,甚至不清楚 continuous 是什么意思,而且这句话通过吓人的引号承认它并不清楚;您需要更多地搜索他们的帖子和/或在 SO 帖子上向他们发表评论以解释他们的意思。
-
“这只是 ID ......” 这不只是 ID。这是一个巨大的危险信号,上面写着“我不了解数据库规范化”。规范化从不引入新属性。没有“过度规范化”之类的东西。只有各种范式 1NF、2NF、BCNF 等。声称“肯定纯粹主义者说标准化时间”,我认为这意味着用代理整数替换时间戳,这只是无稽之谈。代理 id 编号与规范化无关。
-
RickJames 似乎不知道什么是“规范化” 并且 '不要规范化“连续”值'太短了,没有任何意义,甚至不清楚什么连续意味着,这句话承认它通过吓人的引号不清楚。为什么还要问报价是什么意思?我可以猜测这些误解,再加上不明确的文字,导致了这句话。这告诉你我的猜测,而不是他们的意思。评论 RickJames 的帖子,将它们发送到这里。但是不要相信他们对“规范化”一词的使用。 Re "1NF" & "normalization"..
标签: performance database-design database-normalization denormalization