Database DB规范化和单字段中断

Database DB规范化和单字段中断,database,database-design,database-schema,normalization,database-normalization,Database,Database Design,Database Schema,Normalization,Database Normalization,我的问题可能被问了很多次,但我找不到(谷歌搜索也不是很好) 我正试图使我们的数据库正常化。以下是一个例子: 假设我们目前只有一个表: Property --------- id name type 类型可以是: 多家庭 单身家庭 保健 商业的 我可以把它分成一张单独的表格,这样我们就可以: Property Prop_Type -------- ---------- id prop_id name type type_id

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

我正试图使我们的数据库正常化。以下是一个例子:

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

Property
---------
id
name
type
类型可以是:

多家庭 单身家庭 保健 商业的

我可以把它分成一张单独的表格,这样我们就可以:

Property       Prop_Type
--------       ----------
id             prop_id
name           type
type_id
根据2-n的说法,我应该把它分解。但我在性能上究竟节省了什么呢?我同意这样分解表格可以让我们更容易插入新类型的房地产,或者修改当前的房地产。但是假设这不是非常必要,这会导致性能提高吗?字段Property.type最多可容纳一个32字节的字符串,而Property.type_id类似(否?)。另外,在第二个选项中还需要一个额外的表,每次我们想要访问该数据时都需要一个联接。最后,我们的数据库没有那么大(可能有上万条记录),所以节省空间不是优先考虑的

我应该继续正常化还是应该推迟这些小的个人休息


谢谢大家!

我认为这不是正常化问题

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

您想要的是控制不在列中插入无效值。prop_类型表和外键约束是一种解决方案


更合适的解决方案是对柱使用检查约束:

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实现和预期用途的详细信息的情况下谈论设计的性能是没有意义的。但粗略地说,引入ids使用更少的空间,但会导致更多的连接

DBMS的存在是为了将信息存储在由DBMS实现的代数和/或条件查询的表中。只要做最直接的设计。您需要进一步了解模式和查询,然后才能充分了解如何修改性能设计

我同意这样的拆分表可以让我们更容易插入新类型的房地产

不,这让事情变得更难。过去您只需在属性行中输入所需的类型值。对于id,您必须添加一个属性类型行,并在属性行中使用该类型id

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

CHECK(type IN ('multi-family','single-family','healthcare','commercial'))
(否则,请不要)


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

规范化的更重要原因是逻辑和一致性。此外,外键字段通常为32位,而不是32字节。您甚至可以将其设置为1或2字节的字段,因为在查找表中可能不需要更多的行。对于数以万计的记录,您可能不会注意到性能上的差异,但是标准化版本可能会有更好的性能,因为缓存未命中和分页更少。您能解释一下逻辑和一致性部分吗?与中一样,它消除了输入错误的可能性,例如商业与商业?逻辑部分是什么?逻辑:您希望有一组定义良好的值。查找在逻辑上表示这一点;“自由输入”文本字段不可用。对于少量的表和行,现在看起来似乎没有什么意义,但随着应用程序的增长,您会希望它正常化。最好现在就开始。这与规范化无关。两个示例中的函数依赖项是等效的-id确定名称和类型。但是,在第一个示例中,您使用相同的值进行标识和描述。这里的问题是,您是仅仅需要类型标签,还是需要一个稳定、紧凑的标识符?@phoog ZAR提议的更改与规范化无关。此外,ID和没有文本字段或任何其他类型的ID之间表示的内容没有区别,因为可以在其中输入的任何值也可以在另一个中输入。虽然从人体工程学角度讲,单独的名称表不太可能包含意外的名称,因为更新属性不会同时更新正在使用的名称。那么,在什么情况下,我希望进一步细分表呢?以上只是一个例子,但我正在寻找一个关于何时崩溃和何时不崩溃的指南。谢谢@ZAR我会使用像这样的字符串类型