Реляционная база данных: элементы, свойства которых зависят от контекста - PullRequest
1 голос
/ 15 марта 2020

Я пытаюсь настроить базу данных, но я несколько растерялся, как ее структурировать. Кажется, имеет смысл сделать его реляционным, поскольку в моей Базе данных Objects содержатся списки atoms, и эти атомы могут повторяться в других Object элементах. Итак, у нас есть

Object Псевдокод:

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

С чем я борюсь, так это: Атомы имеют разные цвета, в зависимости от того, в каком объекте они появляются. Итак atom1 может быть красным в object1, но зеленым в object2. Их цвет зависит от общего контекста и того, какие другие атомы присутствуют в объекте. Но они не являются концептуально отличными атомами из-за этого - все же имеет смысл сказать, что atom1 иногда зеленый, иногда красный. Я все еще хочу иметь возможность считать их как таковые.

Я не понимаю, как лучше всего смоделировать это в реляционной базе данных. Атомы повторяются в объектах, но некоторые их свойства могут отличаться. Поэтому я не могу просто сказать Object1, чтобы просто посмотреть atom1, atom2, & atom3 из атомов ТАБЛИЦЫ. Любые идеи?

Ответы [ 2 ]

1 голос
/ 15 марта 2020

Это звучит как три таблицы:

objects

  • objectId
  • objectName

atoms

  • atomId
  • atomName

objectAtoms

  • objectId
  • atomId
  • color

Я не уверен, должен ли "цвет" быть отдельной справочной таблицей.

0 голосов
/ 18 марта 2020

Немного подробный, но показывает основную методологию проектирования: предикаты и ограничения на естественном языке.

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
...