什么样的数据模型模型功能参数和结果?

时间:2012-06-21 22:26:06

标签: sql datamodel

下表......:

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

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

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

3 个答案:

答案 0 :(得分:2)

您似乎是以数学为导向的。当Codd(Date)介绍关系模型时,他(他们)将现有的数学语言重新塑造为新的领域。

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

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

答案 1 :(得分: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)
);

(我曾经在一个不得不处理由一个组织严重的委员会设计的关系数据库/ XML / XSLT怪物问题的人旁边工作过。其中,它计算的运输成本部分取决于容器的数量用户很快发现他们可以通过简单地给每个包装的一个维度一个负数来节省运输成本。)

如果删除列“volume_cm3”,表格显然为5NF。 (根本没有非关键属性。)但是如果你包括“volume_cm3”列及其约束,那么这是什么样的正常形式?仍在5NF?

答案 2 :(得分:0)

您展示的V表只是一张桌子。它有一个由3部分组成的键和一个数据列,完全取决于键。使用密钥中的三个度量(也可能是其他度量)的公式导出体积。 Volume的功能依赖性是三部分关键。它不是属性值对。它也不违反任何正常形式。它只是一个包含三部分键和一个数据列的派生表。可以推翻这个问题。