【问题标题】:Relational Database: Items whose Properties depend on Context关系数据库:属性依赖于上下文的项目
【发布时间】:2020-06-26 18:45:42
【问题描述】:

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

Object伪代码:

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

我遇到的问题是:原子有不同的颜色,具体取决于它们出现在什么对象中。所以atom1object1 中可能是红色,但是绿色object2。它们的颜色取决于整体上下文以及对象中存在的其他原子。但它们在概念上并不是不同的原子,因此说atom1 有时是绿色的,有时是红色的仍然是有道理的。我仍然希望能够这样计算它们。

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

【问题讨论】:

    标签: mysql sql database postgresql database-design


    【解决方案1】:

    这听起来像三个表:

    objects

    • objectId
    • objectName

    atoms

    • atomId
    • atomName

    objectAtoms

    • objectId
    • atomId
    • color

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

    【讨论】:

    • 缺少 objects.objectName。我个人更喜欢objects.name / atom.name,否则看起来我们在每列中重复实体名称......
    【解决方案2】:

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

    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以颜色ATOM_COLOR出现在对象OBJECT_ID中。

    (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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-26
      • 2021-07-07
      • 1970-01-01
      • 2012-12-17
      • 2010-11-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多