数据库规范化和单场突破

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 类型的外键。