如何在sql表中描述一个对象?

时间:2015-01-30 01:14:48

标签: mysql sql database

我需要在sql表中描述我的对象。每个对象都有它的ID和大约30个属性(属性数量,每个属性还有3个额外的子属性。它可以是数百个这样的对象,每个对象的状态(属性数,属性值)每10分钟更新一次

所以,我有一个结构:

  

_对象
  _ _ property 1
  _ _ _子属性1
  _ _ _子属性2
  _ _ _子属性3
  _ _ property 2
  _ _ _子属性1
  _ _ _子属性2
  _ _ _子属性3
...

  _ _ property n
  _ _ _子属性1
  _ _ _子属性2
  _ _ _子属性3

哪种方式更好?

1。有N + 1列的四个表,其中N是最大值。物业数量。

- 具有属性的表

| object_id | property_1 | property_2 | ... | prN |

- 包含子属性的表1

| object_id | sub1_1 | sub1_2 | ... | sub1_N |

- 具有子属性的表2

| object_id | sub2_1 | sub2_2 | ... | sub2_N |

- 具有子属性的表3

| object_id | sub3_1 | sub3_2 | ... | sub3_N |

许多细胞可能是空的,这不是好形式。

2。一个表(但更多行)

| object_id | property_number | sub1 | sub2 | sub3 |

或者也许是其他的?

2 个答案:

答案 0 :(得分:3)

您应该尝试规范化信息。

在第一个普通形式中,值不重复,每个字段包含一个值。

在第二范式中,值仅取决于主键。

在第三范式中,没有由另一个值传递确定的值。换句话说,如果B依赖于A而C取决于B,那么C过渡依赖于A.

顺便提一下你问题的答案是使用第一个问题。

在您的情况下,每个主要财产应该在每个单独的项目旁边有一个单独的表格(在另一个表格中)。

将id存储为主键并设置外部引用约束。

CREATE TABLE object (
oid INT(5) NOT NULL,
name VARCHAR(60) NOT NULL UNIQUE,
pid1 INT(5) NOT NULL,
…
PRIMARY KEY(oid)
);

CREATE TABLE property_table_one (
pid INT(5) NOT NULL,
name VARCHAR(60) NOT NULL,
oid INT(5) NOT NULL,
property_one INT NOT NULL,
…
PRIMARY KEY(pid),
FOREIGN KEY(oid) REFERENCES object(oid)
);

^ - 关于你如何做到这一点的粗略想法,但我现在意识到它比乍一看更难;以上可能适用于您的目的,也可能不适合您的目的。它至少是2NF

答案 1 :(得分:1)

为了两者:

  • 容纳波动数量的属性和子属性,无需在宽表中留下多个空值
  • 避免按照1NF重复值

我会使用3个表:

object:
-------
object_id pk| ... associated unique object values

property:
---------
property_id pk | ... associated unique property values

object_property
---------------
object_property_id pk | object_id fk | property_id fk | parent_property_id fk

这将允许您拥有所需数量的属性/子属性。