关系数据库:其属性取决于上下文的项目

时间:2020-03-15 12:07:40

标签: mysql sql database postgresql database-design

我正在尝试建立一个数据库,但是我对如何构造它有些迷失。使其具有关联性似乎很有意义,因为在我的数据库Objects中保存着atoms的列表,并且这些原子可以再次出现在其他Object项中。所以我们有

Object伪代码:

{
  name: 'object1',
  atoms: [ 
    {name: 'atom1', color: 'red'}, 
    {name: 'atom2', color: 'green'}, 
  ...
  ]
}

我要解决的是:原子有不同的颜色,具体取决于它们出现在什么物体中。因此,{{1}中的atom1可能是 red }},但在object1中为绿色。它们的颜色取决于整体环境以及物体中还存在其他原子。但是,由于它们在概念上并不是不同的原子,因此说object2有时是绿色,有时是红色仍然有意义。我仍然希望能够如此计数。

我不知道如何最好地将其建模到关系数据库中。原子再次出现在对象中,但是它们的某些属性可能有所不同。因此,我不能简单地说atom1只是从原子表中查找Object1。有任何想法吗?

2 个答案:

答案 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