我需要在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 |
或者也许是其他的?
答案 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)
为了两者:
我会使用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
这将允许您拥有所需数量的属性/子属性。