我正在尝试建立一个数据库,但是我对如何构造它有些迷失。使其具有关联性似乎很有意义,因为在我的数据库Objects
中保存着atoms
的列表,并且这些原子可以再次出现在其他Object
项中。所以我们有
Object
伪代码:
{
name: 'object1',
atoms: [
{name: 'atom1', color: 'red'},
{name: 'atom2', color: 'green'},
...
]
}
我要解决的是:原子有不同的颜色,具体取决于它们出现在什么物体中。因此,{{1}中的atom1
可能是 red }},但在object1
中为绿色。它们的颜色取决于整体环境以及物体中还存在其他原子。但是,由于它们在概念上并不是不同的原子,因此说object2
有时是绿色,有时是红色仍然有意义。我仍然希望能够如此计数。
我不知道如何最好地将其建模到关系数据库中。原子再次出现在对象中,但是它们的某些属性可能有所不同。因此,我不能简单地说atom1
只是从原子表中查找Object1
。有任何想法吗?
答案 0 :(得分:1)
这听起来像三个表:
objects
objectId
objectName
atoms
atomId
atomName
objectAtoms
objectId
atomId
color
我不确定“ color”是否也应作为单独的参考表。
答案 1 :(得分:0)
有些冗长,但显示了底层的设计方法:自然语言中的谓词和约束。
All attributes (columns) NOT NULL
[p x] = predicate x
(c x.y) = constraint x.y
PK = Primary Key
AK = Alternate Key (Unique)
FK = Foreign Key
[p 1] 存在,由OBJECT_ID
标识的名为OBJECT_NAME
的对象。
(c 1.1)对象由OBJECT_ID
标识。
(c 1.2)每个对象都有一个唯一的名称;对于每个名称,只有一个对象具有该名称。
object {OBJECT_ID, OBJECT_NAME} -- p 1
PK {OBJECT_ID} -- c 1.1
AK {OBJECT_NAME} -- c 1.2
[p 2] 由ATOM_NAME
标识的原子存在。
(c 2.1)原子由原子名称标识。
atom {ATOM_NAME} -- p 2
PK {ATOM_NAME} -- c 2.1
[p 3] 存在原子色ATOM_COLOR
。
(c 3.1)原子色由ATOM_COLOR
标识。
atom_color {ATOM_COLOR} -- p 3
PK {ATOM_COLOR} -- c 3.1
[p 4] 原子ATOM_NAME
以颜色OBJECT_ID
出现在对象ATOM_COLOR
中。
(c 4.1)对于出现在物体中的每个原子;该对象中出现的原子仅以一种原子颜色出现。
(c 4.2)对于每个以某种颜色出现的原子;该原子可能以一种颜色出现在一个以上的物体中。
(c 4.3)对于每个对象和原子颜色;那个原子可能以该颜色出现一个以上的原子。
(c 4.4)如果原子以一种颜色出现在对象中,则该原子必须存在。
(c 4.5)如果原子以某种颜色出现在对象中,则该对象必须存在。
(c 4.6)如果原子以某种颜色出现在对象中,则该原子颜色必须存在。
atom_object {ATOM_NAME, OBJECT_ID, ATOM_COLOR} -- p 4
PK {ATOM_NAME, OBJECT_ID} -- c 4.1, 4.2, 4.3
FK1 {ATOM_NAME} REFERENCES atom {ATOM_NAME} -- c 4.4
FK2 {OBJECT_ID} REFERENCES object {OBJECT_ID} -- c 4.5
FK3 {ATOM_COLOR} REFERENCES atom_color {ATOM_COLOR} -- c 4.6