繁体   English   中英

数据库规范化和单字段突破

[英]DB Normalization and single field break outs

我的问题可能已经被问过很多次了,但是我找不到它(谷歌搜索也不是很好)。

我正在尝试规范化我们的数据库。 这是示例:

假设我们当前只有一个表:

Property
---------
id
name
type

类型可以是:

多户单户医疗保健广告

我可以将其分解为一个单独的表,以便我们有:

Property       Prop_Type
--------       ----------
id             prop_id
name           type
type_id

根据2-n,我应该分手。 但是,我实际上可以节省多少性能呢? 我同意这样拆分表可使我们更轻松地插入新类型的房地产或修改当前的房地产。 但是假设这不是很必要,是否会导致性能提高? 与类似(不?)的Property.type_id相比,字段Property.type最多可容纳32个字节的字符串。 另外,第二个选项中还需要一个附加表,并且每次我们要访问该数据时都需要一个联接。 最后,我们的数据库不是那么大(可能是数以万计的记录),因此节省空间不是优先事项。

我应该继续正常化还是应该暂缓这些小小的个人休息时间?

谢谢!

我认为这不是一个标准化问题。

类型列本质上是离散类型,即具有一组有限的值-当前是多族,单族,医疗保健,商业。

您想要控制没有任何无效值插入到列中。 您的prop_type表和外键约束是一种解决方案。

一个更合适的解决方案是在列上使用“ 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中使用下拉菜单。

我应该继续正常化还是应该暂缓这些小小的个人休息时间?

规范化为较高范式的表格会使用其他列替换其他表格,这些列会根据功能依赖性和联接依赖性而连接回原始列。

根据2-n,我应该把它分解

大概是2NF。 您尚未提供任何信息来证明这一点。 您讨论的操作与规范化无关。

看起来您已经了解标准化问题。 获取介绍和解释其问题,定义和步骤的参考。 使用它们。 引用他们。

但是,我实际上可以节省多少性能呢?

无论性能如何,均应进行规范化。 当您根据基于理想/原始的更改为另一种特定设计的已证明的当前价值而改变时,便会进行更改。

如果没有提供特定DBMS实现的详细信息以及预期的用途,谈论设计的性能就没有意义。 但是粗略地介绍id会占用较少的空间,但会导致更多的联接。

DBMS 存在将信息存储在由DBMS实施的代数和/或条件查询的表中的信息。 只需做出最简单的设计即可。 您需要了解更多有关模式和查询的方式,然后才能充分了解修改性能的设计。

我同意这样拆分表格可以使我们更轻松地插入新类型的房地产,

不,这使它更加困难。 您以前要做的就是在“属性”行中输入所需的类型值。 使用ID,您必须添加Prop_Type行并在Property行中使用该type_id。

如果属性类型的可能值是固定的,则在属性类型上添加CHECK约束:

CHECK(type IN ('multi-family','single-family','healthcare','commercial'))

(否则,不要这样做。)

如果您希望在不更改模式的情况下更新和查询属性的可能值,并且不必为每种类型都包含一个属性,那么这是您原始设计无法表达的。 但是您仍然不需要引入id。 您可以拥有一个Prop_Type表,其中只有一个类型列和一个从Property类型到Prop_Type类型的外键。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM