Дополнительные объекты базы данных (часть 2) - PullRequest
0 голосов
/ 09 сентября 2009

См. "Почти решено" ниже


ПРИМЕЧАНИЕ. Это продолжение и упрощение необязательных объектов базы данных .

Я разрабатываю новую лабораторную базу данных, которая проверяет самые разные тесты на самых разных типах образцов.

Основные объекты:
Каждый из них должен иметь ровно одного родителя (кроме 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.
Хорошо: тип с одним родителем для TestEvent при необходимости)
Плохо: множественный родительский тип для 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.

Пожалуйста, дайте какие-нибудь мысли о том, почему это хороший или плохой вариант.

Ответы [ 3 ]

1 голос
/ 10 сентября 2009

Не ясно, почему необходимо представлять Trial как отдельную сущность. Почему не подходит следующая схема?

Sample        Test           Measurement
------        ----           -----------
SampleId (PK) TestId (PK)    MeasurementId (PK)
Description   SampleId (FK)  TestId (FK)
              TestStartDate  Description
              TestEndDate    MeasuredValue

Из того, что вы сказали до сих пор, кажется, что вы могли бы просто сделать вывод , что Test с более чем одним Measurement считается Trial. То есть, если ваш пользовательский интерфейс должен показать, что в конкретном тесте была пробная версия, он мог бы просто сделать следующее:

if (test.Measurements.Count > 1) {
    _View.Title = test.TestName + " (Trial)"; 
}

Если это не так, какие атрибуты вам нужны, если эта схема отсутствует? Что еще должно быть в таблице Trial, которая здесь недоступна?


Обновление : учитывая дополнительные детали, я бы порекомендовал ввести новую сущность, которую я назову TestRun. A TestRun просто группирует один или несколько Measurements в пределах Test. Trials теперь связаны с TestRuns.

Полученная схема выглядит следующим образом:

Sample        Test           TestRun         Measurement
------        ----           -------         -----------
SampleId (PK) TestId (PK)    TestRunId (PK)  MeasurementId (PK)
Description   SampleId (FK)  TestId (FK)     TestRunId (FK)
              TestStartDate                  Description
              TestEndDate                    MeasuredValue

Trial
-----
TrialId (PK)
TestRunId (FK)
Description

Это очень близко к Вариант 1 в исходном вопросе. Если затраты на поддержание бланка (или фиктивного значения) Trial невелики - например, если у Trials мало или нет атрибутов - это может быть лучшим решением.

1 голос
/ 09 сентября 2009

Из того, что я могу понять из вашего объяснения, можно сказать:

Тест может состоять из одного или нескольких испытаний связан с ним и суд может только быть связанным с одним тестом.

В этом случае Trial является дочерней сущностью Test. Если это так, то у вас может быть две таблицы:

Тест
Trial

Пробная таблица будет иметь поле внешнего ключа обратно в тестовую таблицу (что означает связь). Таким образом, каждое испытание будет связано только с одним тестом, и каждый тест может иметь несколько связанных испытаний.

0 голосов
/ 10 сентября 2009

Вот воздушный змей, поднятый предположениями и интерпретациями.

A request поставляется с sample и спецификацией процедур, которые необходимо выполнить на образце. Если sample является единственным (бутылка жидкости), то это тест и собирается один набор измерений. Если sample является кратным (блок с маркерами, временной ряд), то это испытание и собирается повторный набор мер, по одному на sample экземпляр.

Другими словами, тестовая / пробная дихотомия - это красная сельдь, а measurement - это таблица пересечений между test и sample.

REQUEST
-------
RequestId (PK)
Specification

SAMPLE
------
RequestId (FK)
SampleId (PK)

TEST
----
RequestId (FK)
TestId (PK)
TestStartDate
TestEndDate

MEASUREMENT
-----------
TestId (FK)   
SampleId (FK) 
MeasurementDescription
MeasuredValue

Measurement(TestId,SampleId) - составной уникальный ключ. В зависимости от того, как вы относитесь к композитам, вы можете определить суррогат MeasurementId (PK).

Очевидно, что может потребоваться дальнейшая нормализация. Например, вы можете / должны разделить выборку на две таблицы sample и sample_instance. Трудно сказать, не зная всех приписанных атрибутов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...