Mysql 如何在sql表中描述对象?
我需要在sql表中描述我的对象。每个对象都有其ID和大约30个属性(属性数,每个属性还有3个子属性。它可以是数百个这样的对象,每个对象的状态(属性数,属性值)每10分钟更新一次 因此,我有一个结构: _对象Mysql 如何在sql表中描述对象?,mysql,sql,database,Mysql,Sql,Database,我需要在sql表中描述我的对象。每个对象都有其ID和大约30个属性(属性数,每个属性还有3个子属性。它可以是数百个这样的对象,每个对象的状态(属性数,属性值)每10分钟更新一次 因此,我有一个结构: _对象 __uu属性1 _子属性1 _子属性2 _子属性3 __uu财产2 _子属性1 _子属性2 _子属性3… __uu财产n _子属性1 _子属性2 _子属性3 哪条路更好 1.有N+1列的四个表,其中N是属性的最大数量。 --具有属性的表 | object_id | property_1 |
__uu属性1
_子属性1
_子属性2
_子属性3
__uu财产2
_子属性1
_子属性2
_子属性3
…
__uu财产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.一张表(但多行)
或者可能是其他方面?您应该尝试将信息标准化 在第一个范式中,值不重复,每个字段包含一个值 在第二范式中,值仅依赖于主键 在第三范式中,不存在由另一个值传递确定的值。换句话说,如果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,以便:
- 适应不断变化的属性和子属性的数量,而不在宽表中留下大量空值
- 根据1NF避免值重复
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
这将允许您拥有所需的尽可能多的属性/子属性。规范化它,这是您最好的选择。1NF表示值不重复/1每列值;2NF表示主键是其他字段所基于的字段,3NF表示没有传递关系。您是在说NF?0F吗当然我考虑过,但如果我知道如何在我的情况下规范化它,我不会寻求帮助。是的,规范化(标准形式)
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