Mysql 关系数据库:属性依赖于上下文的项

Mysql 关系数据库:属性依赖于上下文的项,mysql,sql,database,postgresql,database-design,Mysql,Sql,Database,Postgresql,Database Design,我正试图建立一个数据库,但对于如何构建它,我有些不知所措。将其设置为关系似乎是有意义的,因为在我的数据库中对象包含原子的列表,这些原子可以在其他对象项中重复出现。所以我们有 对象伪代码: { name: 'object1', atoms: [ {name: 'atom1', color: 'red'}, {name: 'atom2', color: 'green'}, ... ] } 我遇到的困难是:原子有不同的颜色,这取决于它们出现在什么对象中。因此at

我正试图建立一个数据库,但对于如何构建它,我有些不知所措。将其设置为关系似乎是有意义的,因为在我的数据库中
对象
包含
原子的列表
,这些原子可以在其他
对象
项中重复出现。所以我们有

对象
伪代码:

{
  name: 'object1',
  atoms: [ 
    {name: 'atom1', color: 'red'}, 
    {name: 'atom2', color: 'green'}, 
  ...
  ]
}
我遇到的困难是:原子有不同的颜色,这取决于它们出现在什么对象中。因此
atom1
object1
中可能是红色,但在
object2
中可能是绿色。它们的颜色取决于整体环境和对象中存在的其他原子。但是由于这一点,它们在概念上并不是不同的原子——可以说,
atom1
有时是绿色的,有时是红色的。我仍然希望能够将它们计算在内


我不明白如何最好地将其建模到关系数据库中。原子再次出现在物体中,但它们的某些性质可能不同。因此,我不能简单地说,要从atoms表中查找
atom1、atom2和atom3,只需调用
Object1
。有什么想法吗

这听起来像是三张表:

对象

  • objectId
  • objectName
原子

  • atomId
  • atomName
objectAtoms

  • objectId
  • atomId
  • color

我不确定“color”是否也应该是一个单独的参考表。

有点冗长,但显示了基本的设计方法:自然语言中的谓词和约束

所有属性(列)不为空
[px]=谓词x
(c x.y)=约束x.y
PK=主键
AK=备用键(唯一)
FK=外键

[p 1]存在由
对象ID
标识的对象,该对象名为
对象名

(c 1.1)对象由
对象ID
标识

(c 1.2)每个物体只有一个名称;对于每个名称,只有一个对象具有该名称

object{object\u ID,object\u NAME}--p1
PK{OBJECT_ID}--c1.1
AK{OBJECT_NAME}--C1.2
[P2]存在由
Atom\u NAME
标识的原子

(c 2.1)原子通过原子名称来识别

atom{atom_NAME}--p2
PK{ATOM_NAME}--c2.1
[p3]原子颜色
原子颜色
存在

(c 3.1)原子颜色通过
Atom\u color
来识别

atom_color{atom_color}--p3
PK{ATOM_COLOR}--c3.1
[p4]原子
原子名称
出现在对象
对象ID
的颜色
原子颜色

(c 4.1)出现在物体中的每个原子;出现在该对象中的原子正好以一种原子颜色出现

(c 4.2)对于以颜色出现的每个原子;那个原子可以在不止一个物体上以那个颜色出现

(c 4.3)每个物体和原子颜色;一个以上的原子可能以该颜色出现在该物体中

(C4.4)如果一个原子以某种颜色出现在一个物体上,那么这个原子一定存在

(C4.5)如果一个原子以某种颜色出现在一个物体上,那么这个物体一定存在

(C4.6)如果一个原子以某种颜色出现在一个物体中,那么该原子的颜色必须存在

atom\u object{atom\u NAME,object\u ID,atom\u COLOR}--p4
PK{ATOM_NAME,OBJECT_ID}--c4.1,4.2,4.3
FK1{ATOM_NAME}引用了ATOM{ATOM_NAME}--C4.4
FK2{OBJECT_ID}引用对象{OBJECT_ID}--C4.5
FK3{ATOM_COLOR}引用了ATOM_COLOR{ATOM_COLOR}--C4.6

缺少objects.objectName。就我个人而言,我更喜欢objects.name/atoms.name,否则看起来我们在每个列中重复实体名称。。。