См. "Почти решено" ниже
ПРИМЕЧАНИЕ. Это продолжение и упрощение необязательных объектов базы данных .
Я разрабатываю новую лабораторную базу данных, которая проверяет самые разные тесты на самых разных типах образцов.
Основные объекты:
Каждый из них должен иметь ровно одного родителя (кроме REQ
) и как минимум одного родителя (кроме MEA
).
Request REQ - the form
Sample SAM - the materials on the form to be tested
Test TST - the procedures to be performed on the sample
(Trial ** TRI - instance of duplicate methods for statistics)
Measurement MEA - a single measured number
** A Trial is optional. (see below)
Дополнительное объяснение пробной версии
Многие тесты - простая процедура с несколькими измерениями. Например, «Добавить 10 мл 15% KNO3 к образцу, затем получить плотность и pH».
Однако некоторые тесты требуют выполнения одной и той же процедуры на отдельных участках образца. Давайте использовать баллистические испытания в качестве примера. Заказчик может запросить среднюю скорость и точность выхода для этих 20 пуль. sample
- это набор из 20 пуль. test
- это «собирать скорость и точность на выходе». trials
- это 20 отдельных выстрелов. measurements
- скорость и точность на выходе для каждого выстрела (trial
).
ВОПРОС
Как мне моделировать сущности Test
, Trial
и Measurement
, поскольку сущность Trial
является необязательной?
Вариант 1: Используйте "пустой" пробный объект в качестве заполнителя, если он не нужен.
Хорошо: родительский объект всегда один и тот же.
Плохо: Trial
записи существуют, даже если они не нужны.
Вариант 2: Вкатить Trial
в таблицу Test
в качестве дополнительного теста. Измерение всегда будет иметь test
в качестве родителя.
Хорошо: тип с одним родителем для измерения (Test
)
Плохо: множественный родительский тип для Test
: Sample
или Test
Вариант 3: Измерение все еще имеет одного родителя, но родитель может быть либо test
, либо trial
.
Хорошо: тип с одним родителем для Test
(и Event
при необходимости)
Плохо: множественный родительский тип для Measurement
: Test
или Trial
Вариант 4: Пробная версия в качестве дочернего объекта. Measurement
требуется test_id
и необязательно trial_num
. Пробная версия имеет PK (test_id
, trial_num
).
Хорошо: нет нескольких родительских типов.
Плохо: не уверен
Опция X: Любая другая опция, не упомянутая ранее.
Почти решено: Теперь я считаю вариант 4 (Испытание как суб-сущность) лучшим. Ниже приведены основные правила для варианта 4.
- A measurement
всегда принадлежит test
.
- A trial
существует только при необходимости.
- Trial_num
устанавливается, когда в наборе существует несколько испытаний.
- В противном случае trial_num
является нулевым, чтобы указать, что trial
не требуется.
Simple ER Diagram
-----------------
REQ <- SAM <- TST <- MEA
^ |
| |
|-(TRI)<-|
Table Keys
----------
Table | PK | FK
------+-----------------+----------------
REQ | REQ_id |
SAM | SAM_id | REQ.PK
TST | TST_id | SAM.PK
(TRI | TST_id, TRI_num | TST.PK )
MEA | MEA_id | TST.PK, TRI.PK*
* TRI.PK is null if trial entity is not needed.
Пожалуйста, дайте какие-нибудь мысли о том, почему это хороший или плохой вариант.