数据库规范化和单场突破
DB Normalization and single field break outs
我的问题可能已经被问过很多次了,但我不太清楚(谷歌搜索也不是很好)。
我正在尝试规范化我们的数据库。这是示例:
假设我们目前有一个 table:
Property
---------
id
name
type
类型可以是:
多户型
单亲家庭
卫生保健
商业
我可以把它分解成一个单独的 table 这样我们就有了:
Property Prop_Type
-------- ----------
id prop_id
name type
type_id
按照2-n,我应该把它拆了。但是我实际上在性能上节省了什么?我同意像这样分解 tables 使我们更容易插入新类型的不动产,或修改当前的不动产。但假设这不是非常必要,这会导致性能提升吗?字段 Property.type 最多容纳一个 32 字节的字符串,而 Property.type_id 是相似的(不是吗?)。此外,第二个选项还需要一个额外的 table,并且每次我们想要访问该数据时都需要一个连接。最后,我们的数据库不是那么大(可能有几万条记录),所以space节省不是优先事项。
我应该继续正常化还是应该推迟这些小的个人休息时间?
谢谢!
我认为这不是归一化问题。
类型列本质上是一种离散类型,即具有一组有限的值 - 目前是多户型、单户型、医疗保健、商业。
你想要的是控制不向列中插入无效值。您的 prop_type table 和外键约束是一种解决方案。
更合适table的解决方案是在列上使用 CHECK CONSTRAINT:
CREATE TABLE Property
(
id int PRIMARY KEY,
name ...,
type varchar(20) CONSTRAINT typeValues CHECK (type IN ('multi-family', 'single-family', 'healthcare', 'commercial'))
)
更进一步,无需在每条记录中存储完整的类型字符串。您可以简单地使用单个字符 编码 类型:
CREATE TABLE Property
(
...
type char(1) CONSTRAINT typeValues CHECK (type IN ('M', 'S', 'H', 'C'))
)
当您提供类型时,例如在 GUI 中,您需要将它们翻译成用户可读的文本。要输入一个值,您可以使用 GUI 中的下拉菜单。
Should I continue to normalize or should I hold off on these small individual breaks?
标准化为更高的范式取代了 table 其他人使用相同的列,这些列基于功能依赖性和连接依赖性连接回原始。
According to 2-n, I should break this up
大概你的意思是2NF。你没有提供任何信息来证明这一点。而你讨论的做的事情与归一化无关。
看来您对标准化一无所知。获取介绍和解释其问题、定义和程序的参考。使用它们。引用他们的话。
But what am I actually saving in performance?
无论性能如何,都应该进行标准化。当根据 ideal/original.
更改为另一个特定设计所证明的现值证明合理时,您就会更改
在没有详细了解特定 DBMS 实现和预期用途的情况下谈论设计的性能是没有意义的。但粗略地说,引入 ids 使用更少 space 但会导致更多连接。
DBMSes exist 将信息存储在 tables 中,通过 DBMS 实现的代数 and/or 条件查询。只做最简单的设计。您需要更多地了解架构和查询,然后才能了解足够的知识来修改设计以提高性能。
I agree that breaking up tables like this makes it easier for us to insert new types of real estate,
不,这让事情变得更难了。您过去所要做的就是在 属性 行中输入您想要的类型值。使用 id,您必须添加 Prop_Type 行并在 属性 行中使用 type_id。
如果 属性 类型的可能值是固定的,则在 属性 类型上添加 CHECK 约束:
CHECK(type IN ('multi-family','single-family','healthcare','commercial'))
(否则不要。)
如果您希望在不更改架构的情况下更新和查询属性的可能值,并且不必为每种类型提供 属性,那么这是您的原始设计无法表达的。但是你仍然不需要引入id;你可以有一个 Prop_Type table 只有一个类型列和一个从 属性 类型到 Prop_Type 类型的外键。
我的问题可能已经被问过很多次了,但我不太清楚(谷歌搜索也不是很好)。
我正在尝试规范化我们的数据库。这是示例:
假设我们目前有一个 table:
Property
---------
id
name
type
类型可以是:
多户型 单亲家庭 卫生保健 商业
我可以把它分解成一个单独的 table 这样我们就有了:
Property Prop_Type
-------- ----------
id prop_id
name type
type_id
按照2-n,我应该把它拆了。但是我实际上在性能上节省了什么?我同意像这样分解 tables 使我们更容易插入新类型的不动产,或修改当前的不动产。但假设这不是非常必要,这会导致性能提升吗?字段 Property.type 最多容纳一个 32 字节的字符串,而 Property.type_id 是相似的(不是吗?)。此外,第二个选项还需要一个额外的 table,并且每次我们想要访问该数据时都需要一个连接。最后,我们的数据库不是那么大(可能有几万条记录),所以space节省不是优先事项。
我应该继续正常化还是应该推迟这些小的个人休息时间?
谢谢!
我认为这不是归一化问题。
类型列本质上是一种离散类型,即具有一组有限的值 - 目前是多户型、单户型、医疗保健、商业。
你想要的是控制不向列中插入无效值。您的 prop_type table 和外键约束是一种解决方案。
更合适table的解决方案是在列上使用 CHECK CONSTRAINT:
CREATE TABLE Property
(
id int PRIMARY KEY,
name ...,
type varchar(20) CONSTRAINT typeValues CHECK (type IN ('multi-family', 'single-family', 'healthcare', 'commercial'))
)
更进一步,无需在每条记录中存储完整的类型字符串。您可以简单地使用单个字符 编码 类型:
CREATE TABLE Property
(
...
type char(1) CONSTRAINT typeValues CHECK (type IN ('M', 'S', 'H', 'C'))
)
当您提供类型时,例如在 GUI 中,您需要将它们翻译成用户可读的文本。要输入一个值,您可以使用 GUI 中的下拉菜单。
Should I continue to normalize or should I hold off on these small individual breaks?
标准化为更高的范式取代了 table 其他人使用相同的列,这些列基于功能依赖性和连接依赖性连接回原始。
According to 2-n, I should break this up
大概你的意思是2NF。你没有提供任何信息来证明这一点。而你讨论的做的事情与归一化无关。
看来您对标准化一无所知。获取介绍和解释其问题、定义和程序的参考。使用它们。引用他们的话。
But what am I actually saving in performance?
无论性能如何,都应该进行标准化。当根据 ideal/original.
更改为另一个特定设计所证明的现值证明合理时,您就会更改在没有详细了解特定 DBMS 实现和预期用途的情况下谈论设计的性能是没有意义的。但粗略地说,引入 ids 使用更少 space 但会导致更多连接。
DBMSes exist 将信息存储在 tables 中,通过 DBMS 实现的代数 and/or 条件查询。只做最简单的设计。您需要更多地了解架构和查询,然后才能了解足够的知识来修改设计以提高性能。
I agree that breaking up tables like this makes it easier for us to insert new types of real estate,
不,这让事情变得更难了。您过去所要做的就是在 属性 行中输入您想要的类型值。使用 id,您必须添加 Prop_Type 行并在 属性 行中使用 type_id。
如果 属性 类型的可能值是固定的,则在 属性 类型上添加 CHECK 约束:
CHECK(type IN ('multi-family','single-family','healthcare','commercial'))
(否则不要。)
如果您希望在不更改架构的情况下更新和查询属性的可能值,并且不必为每种类型提供 属性,那么这是您的原始设计无法表达的。但是你仍然不需要引入id;你可以有一个 Prop_Type table 只有一个类型列和一个从 属性 类型到 Prop_Type 类型的外键。