0

下表...:

CREATE TABLE v (
    height int,
    width int,
    depth int,
    volume int,
    PRIMARY KEY (height, width, depth);
)

... 可用于存储名为 volume: 的 3 个变量的函数的输入和输出volume(height, width, depth) = height * width * depth

我在这里使用什么样的数据模型?是实体-属性-值吗?

4

3 回答 3

2

你似乎是数学导向的。当 Codd(Date) 引入关系模型时,他(他们)将现有的数学语言重塑到了新的领域。

在您的情况下: value 可能是三个参数的函数:val = f(h,w,d). 但是对于“关系”(数据库表),情况略有不同:仅当 {h,w,d} 实际存在于表中时才定义该函数。在数学中,函数是在整个 R3 域上定义的。在关系代数中,表的键 ({h,w,d}) 是在更受限制的域(或一组域的乘积)上定义的。大多数 DBMS/SQL 世界都涉及这些限制。(约束、域约束等) UNIQUE 约束可能是最基本的约束:它保证最多有一个具有特定 {h,w,d} 的元组。结果只有一个函数. DBMS 人称关系的非键字段在 FK 上“功能依赖”({h,w,d}}:给定一组键,最多可以有一行对应于它(最多一个“功能价值”)

EAV 只是一类数据模型,用于“模拟”一个对象具有可变数量的属性,而不更改所涉及的表的定义。但是,在表级别上,它只是意味着添加一个带有属性和值的额外表(实际上是两个表)。数据建模只是变相的拓扑。

于 2012-06-21T22:57:20.127 回答
0

不,它不是 EAV 模型。您只是对矩形实体的尺寸进行建模,并选择存储体积。在现实世界中,您可能会包括测量单位和一些检查约束。

CREATE TABLE v (
    height_cm int not null check (height_cm > 0),
    width_cm int not null check (width_cm > 0),
    depth_cm int not null check (depth_cm > 0),
    volume_cm3 int not null check (volume_cm3 = height_cm * width_cm * depth_cm),
    PRIMARY KEY (height_cm, width_cm, depth_cm)
);

(我曾经与一个必须处理关系 db/XML/XSLT 怪物问题的人一起工作,该怪物是由一个组织不善的委员会设计的。除其他外,它部分根据一个容器中可以容纳多少个容器来计算运输成本。火车车厢。用户很快发现他们可以通过简单地给每个包裹的一个维度指定一个负数来节省运输成本。)

如果删除列“volume_cm3”,则该表显然是 5NF。(根本没有非键属性。)但是如果你包括列“volume_cm3”及其约束,这是什么正常形式?还在5NF吗?

于 2012-06-21T22:54:41.073 回答
0

您显示的 V 表只是一个表。它有一个由 3 部分组成的键和一个数据列,完全依赖于键。成交量是通过使用关键中的三个度量(可能还有其他一些度量)的公式得出的。Volume 的功能依赖是三部分的关键。它不是一个属性值对。它也不违反任何正常形式。它只是一个具有三部分键和一个数据列的派生表。这个问题有可能想得太多。

于 2012-08-27T03:43:14.827 回答