одна таблица или много для разных, но взаимодействующих событий? - PullRequest
4 голосов
/ 26 января 2011

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

Самое основное в этом конкретном зонтике - это событие, поэтому я подумал о том, чтобы иметь одну таблицу Событий с полями для всех свойств, которые могут появиться. Это может быть громоздким, потому что подавляющее большинство полей окажется пустым для многих стран; но я не уверен, что это действительно проблема. Преимущество этого способа заключается в том, что будет проще вызывать и отображать все события. Но так как многие из событий будут иметь общую метку времени, я задаюсь вопросом, относятся ли они к одной таблице.

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

некоторые типы событий имеют длительность. некоторые сравнительно очень редки. Один класс событий, как правило, представляет собой скорость, которая остается неизменной, если скорость не изменяется навсегда или с временным переопределением (это те, о которых я больше всего беспокоюсь). Некоторые из них представляют собой простые двоичные теги (для которых я планировал создать таблицу ссылок, но для простоты мне понадобится / я бы предпочел общий event_id, чтобы связать их с ними.

Я склоняюсь к тому, что лучше всего иметь несколько таблиц с тесно связанными типами информации, а не одну таблицу со всем и большим количеством места ... но я не совсем уверен, как действовать.

Мне бы хотелось получить совет по стратегии определения наилучшего подхода в такой ситуации.

редактирование: Вот краткое изложение типов данных, с которыми я имею дело, на случай, если это прояснит ситуацию

events:
-blood glucose 
     timestamp
     value 
     (tagged w/: from pump, manually entered
     [pre-meal, post-meal (breakfast, lunch, dinner) before bed, fasting, hypo, high, hyper  - which will be either manually entered or inferred based on settings or other user entries], before/after exercise etc i imagine would be better off dynamically generated with queries as necessary. though could apply same paradigm to the meals?

-sensor glucose (must be separate bc it is not as reliable so will be different number from regular bg test, also unlikely to be used by majority of users.)
     timestamp
     amount

-bolus 
     (timestamp)
     bolus total
     food total
     correction total 
     active insulin**
     bolus type - normal[vast majority] square wave or dual wave

-food
     (timestamp)
     carb amount
     carb type (by weight or exchanges) <- this could probably be in user settings table
     food-description
     carb-estimated (binary) 
     meal? - or separate table.
     (accompanying bolus id? though that seems to finicky)

-meals
     timestamp
     mealname (breakfast, lunch, supper) (or mealnames table? seems excessive?)

-basal
     timestamp
     rate per hour
     rate changes throughout day on regular pattern, so either automatically fill in from 'last activated pattern' (in the form midnight: 0.7/hr, 7am: 0.9/hr, 12pm: 0.8/hr etc)
     create new pattern whenever one is used

-temp basal
     (regular basal pattern can be overridden with temporary basal)
     temp basal start
     ?temp basal end and/or temp basal duration
     temp basal amount
     temp basal type -> either in % or specific rate.

-exercise
     start-time
     end-time
     intensity
     ?description (unless 'notes' is universal for any event)

-pump rewind (every 3 days or so)
     -time

-pump prime
     -amount
     -type (fixed or manual)

-pump suspended
     start-time
     end-time

-keytones
     time
     result

-starred
     event

-flagged
     event

-notes
     timestamp
     (user can place a note with any event to provide details or comments, but might want a note where there is no data as well.)

(i want a way for users to flag specific events to indicate they are result of error or otherwise suspect, and to star events as noteworthy either to discuss with doctor or to look at later)

**only place I get active insulin from is when a bolus is entered, but it could be useful other times as a constantly tracked variable, which could be calculated by looking at boluses delivered up to X time ago where X is the Active Insulin Time.

other infrequent events (likely 2-10 per year):
-HbA1C 
     time
     value
-weight
     time
     value
     units
-cholesterol
     time
     value
-blood pressure
     time
     value

-pump settings (will need to track settings changes, but should be able to do that with queries)
     -timestamp
     -bg-target
     -active insulin time
     -carb ratios (changes throughout day like basal)
     -sensitivity
     -active insulin time

проблемы. 1) всеобъемлющая таблица 'событий' с типом, чтобы быстро вернуть все события за определенный период времени без необходимости запрашивать каждую таблицу? (недостаток в том, как мне работать с событиями с продолжительностью? иметь дополнительное время окончания в таблице событий?)

2) это локальная база данных, которая, как правило, будет одним пользователем, и никогда не будет необходимости сравнивать или взаимодействовать с записями других пользователей, если они синхронизируются в Интернете, поэтому я думал о сохранении одной версии базы данных для каждого пользователя, хотя, возможно, добавляя идентификатор пользователя при его загрузке.

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

Некоторая информация о том, для чего будет использоваться база данных: -Визуальное представление всех типов данных в течение дня -Среднее все результаты теста и процент инсулина, который используется для питания, коррекции, базальных. -А также конкретные расширенные запросы, такие как: перечислите до 20 примеров разницы в уровне глюкозы между уровнем глюкозы перед сном и утренней глюкозой, когда пища не употреблялась, и не выполнялась физическая нагрузка в течение 2 часов после сна, с момента последнего изменения настроек и т.д. -program автоматически назначит теги на основе параметров. например, если во время назначенного «обеденного» периода употребляется> 20 углеводов, это означает, что еда - это обед. если в течение 30 минут есть два приема пищи (или предпочтение «длительность приема пищи»), они сгруппируют их как одно блюдо… не совсем уверен, как это будет действовать прямо сейчас.

Ответы [ 4 ]

12 голосов
/ 27 января 2011

V1.0

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

Ваше требование требует обычного кластера таблиц Supertype-Subtype.К сожалению, обычные реляционные структуры, подобные этой, не являются «общими».

  • Стандартным символом подтипа является полукруг.

    • Количество элементов Supertype :: Subtype всегда равно 1 :: 0-к-1.

    • Первичный ключ подтипа - первичный ключ супертипа.Это также внешний ключ для супертипа.

  • Существует два типа:

    • Эксклюзивно, где естьтолько один подтип для каждой строки супертипа, обозначенный через X полукругом.

    • Неисключительный, где имеется более одного подтипа на строку супертипа

  • Ваш эксклюзив.Для этого типа требуется дискриминатор, чтобы определить, какой подтип активен для строки супертипа.Если число подтипов невелико, можно использовать индикаторы;в противном случае требуется таблица классификации.

  • Обратите внимание, что все это, структуры, правила, ограничения, необходимые для его поддержки и обеспечения целостности данных, доступно в обычном режиме.IEC / ISO / ANSI SQL.(Не-SQL не соответствуют требованию SQL).

Данные

  1. Именование очень важно.Рекомендуется называть таблицу по строке, а не по содержанию, значению или действию.Вы говорите о событиях, но я могу видеть только чтения.

  2. Для этих чтений или событий должен быть контекст.Я не вижу, как EventId висит в воздухе.Я предположил, что чтения о конкретном пациенте.Пожалуйста, сообщите, и я поменяю модель.

  3. Составные или составные ключи являются нормальными.SQL вполне способен (не-SQL нет).PatientId уже существует как FK в Reading, и он используется для формирования его PK.Нет необходимости в дополнительном столбце ReadingId и дополнительном индексе , который будет на 100% избыточным.

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

  5. Это чистая пятая нормальная форма (без дублирования столбцов; без аномалий обновления).

    • Это может быть далее нормализовано до шестой нормальной формы, и, таким образом, могут быть получены дополнительные преимущества;и 6NF можно оптимизировать и т.д .;но все это не требуется здесь.

    • Некоторые таблицы имеют формат 6NF, но это является следствием, а не намерением, поэтому его нельзя объявлять как таковое.
      .

  6. Если вы предоставите информацию о лимитах и ​​переопределениях, которые вас интересуют, я могу предоставить модель, которая решит эти проблемы.

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

▶ Чтение модели данных ◀

Читатели, не знакомые со Стандартом моделирования реляционных баз данных, могут найти ▶ IDEF1X Notational ◀ полезно.

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

Предостережение

  1. Толпа OO и ORM (во главе с Фаулером и Амблером) ничего не знают о реляционных технологиях и базах данных. Проектирование объектов сильно отличается от моделирования данных. Если вы примените их объектный дизайн к базам данных, вы получите чудовища, которые нуждаются в «рефакторинге», и вам придется купить еще одну «книгу», которая покажет вам, как это сделать эффективно. Между тем «база данных» покалечена.

  2. Реляционные базы данных, которые смоделированы правильно (как данные, а не объекты), никогда не нуждаются в "повторном факторинге". В сильно нормализованных базах данных вы можете добавлять таблицы, столбцы и функции без необходимости изменять существующие данные или код.

  3. Даже концепция ORM полностью ошибочна. Данные имеют больше постоянства, чем объекты. Если вы сначала смоделируете данные, а затем смоделируете свои объекты для данных, они будут очень стабильными. Но если вы сначала смоделируете свои объекты (что в любом случае странно, без понимания данных), а затем смоделируете данные после объектов, вы будете перемещаться взад-вперед, постоянно корректно и то, и другое.

  4. Реляционные базы данных имеют совершенно обычные структуры, такие как Supertype-Subtype, более 30 лет, и они работают хорошо, если они реализованы таким образом. Они не являются "gen-spec" или "наследованием классов" или чем-то подобным OO; и если эти структуры OO или ORM будут реализованы без правильного моделирования данных, «база данных» будет повреждена, и потребуется «мы-факторинг».

    • Кроме того, они не реализуют требуемые ограничения целостности данных, поэтому обычно качество данных низкое. Мы не допускаем попадания неверных данных в базу данных; их «базы данных» полны неверных данных, и им нужна еще одна «книга» о том, как стирать грязные данные.
      ,
  5. Они перепутали последовательность и иерархию. Если все сделано правильно, то нет «несоответствия импеданса», нет псевдотехнических имен, маскирующих чистую глупость; чтобы оправдывать выполнение одного и того же набора работы снова и снова.

Так что бегите, как черт, от любого, кто использует терминологию OO или ORM при работе с реляционными базами данных.

V1.1

Ваше редактирование предоставляет гораздо больше деталей, которые, конечно, требуются, потому что контекст, весь, необходим, если данные должны быть смоделированы правильно. Это включает в себя всю эту информацию. Тем не менее, вопросы остаются, и некоторые назад и вперед потребуется, прежде чем он может быть завершен. Не стесняйтесь задавать вопросы обо всем, что не совсем понятно; Я точно не знаю, в чем разница, пока я не подброшу что-нибудь, а вы говорите с ним.

▶ Модель данных события V1.1 ◀

  1. Все мои модели являются чисто реляционными (сохраняют полную реляционную мощность), совместимы с IDEF1X и пятой нормальной формой (без обновлений) Все правила (бизнес или данные / ссылочная целостность), которые нарисованы в модели, могут быть реализованы как декларация в ISO / IEC / ANSI SQL.

  2. Никогда ничего не кодировать жестко. Мои модели не требуют этого, и любой код, работающий с базой данных, не должен этого делать. Весь фиксированный текст нормализуется в справочные или справочные таблицы. (этот бит неполный; вам необходимо заполнить пробелы).

    • Короткий буквенный код намного лучше, чем перечисление; как только вы привыкните к нему, значения и значения сразу станут узнаваемыми.

    • Поскольку они являются ПК и поэтому стабильны, вы можете смело кодировать:

      ... WHERE EventTypeCode = "P"
      или
      ... WHERE EventTypeCode LIKE "T%"

  3. Я считаю, что DataTypes самоочевидны или могут быть легко разработаны. Если нет, пожалуйста, спросите.

  4. Все, что ваша заметка как "привередливая", совершенно верно.Проблема в том, что, поскольку у вас не было базы данных для взаимодействия, вы не знали, что должно быть в базе данных, а что должно быть или может быть кодом SQL.Поэтому для всех «привередливых» элементов (элементов базы данных) вам необходимо создать код.Опять же, если есть разрыв, пожалуйста, спросите.

    • Я говорю, работая в традиционном стиле Я - модельер данных, вы - разработчик , вы должны убедиться, что каждый элемент с вашей точки зрения доставлен,вместо того, чтобы полагаться на меня, чтобы интерпретировать ваши записи.Я буду предоставлять базу данных, которая поддерживает все требования , которые я могу почерпнуть из ваших заметок .
      .
  5. Один пациент на базу данных.Давайте учтем вероятность того, что ваша система будет успешной, в будущем у вас будет одна центральная база данных о рабочих лошадках, вместо того, чтобы ограничивать ее одной базой данных на пациента, что было бы кошмаром для администрирования.Допустим, вам нужно хранить все данные о пациенте в одном месте, одну версию правды.Это то, что я предоставил.Это не ограничивает вас в краткосрочной перспективе от введения одного Db на пациента;нет проблем вообще с одной строкой в ​​таблице Patient.

    • С другой стороны, я могу удалить PatientId из всех таблиц, и когда вы перерастете в конфигурацию центральной базы данных, вам потребуется серьезное обновление базы данных.

    • Аналогичным образом, если у вас есть датчики или насосы, которые необходимо отслеживать, укажите их атрибуты.Любые атрибуты датчика или насоса затем будут нормализованы в эти таблицы.Если это «один на пациента», это нормально, в этих таблицах будет одна строка, если вам не нужно хранить историю датчиков или насосов.

  6. В версии 1.0 подтипы были исключительными.Теперь они не эксклюзивны.Это означает, что мы отслеживаем хронологию событий, без дублирования ;и любое отдельное событие может состоять из нескольких подтипов.Например.Заметки могут быть вставлены для любого события.

    • Перед завершением необходимо предоставить предоставленный список EventType в виде сетки, показывающей (a) разрешенные (b) обязательные подтипы для каждого EventType.Это будет реализовано как CHECK Constraints в Event.
      .
  7. Именование очень важно.Я использую стандарт ISO 11179 (руководящие принципы и принципы) плюс свои собственные соглашения.Тип чтения События имеют префикс как таковой.Не стесняйтесь предлагать изменения.

  8. Единицы.Традиционно, мы используем либо Metric xor US Imperial по всей базе данных, разрешаем вводить то, что нравится пользователю, и конвертируем перед хранением.Если вам нужна смесь, тогда, по крайней мере, мы должны указать UnitType на уровне пациента или насоса, а не разрешать хранение любого типа UnitType.Если вам действительно нужен какой-либо UnitType, изменяющийся туда-сюда, тогда да, нам нужно хранить UnitType с каждым таким значением.

  9. Временная база данных.У вас есть временные ряды, записываемые и хорошо интерпретируемые с помощью SQL.Большая тема, так что читайте об этом.Минимум, который я бы попросил вас прочитать и понять:

    ▶ Производительность базы данных во времени (0NF против 5NF) ◀

    ▶ Классическая временная база данных 5NF 12 (внимательно осмотрите модель данных)

  10. В основном проблема сводится к следующему:

    • Либо у вас есть истинная база данных 5NF, нет дублирования данных, нет аномалий обновления.

      • Это означает, что для непрерывных временных рядов записывается только StartDateTime.EndDtateTime легко выводится из StartDateTime строки next , он не сохраняется.Например.Событие - это непрерывная хронология;EventType определяет, является ли Событие определенным DateTime или Периодом / Длительностью.

      • EndDateTime хранится только для непересекающихся периодов, где между периодами имеются законные промежутки;в любом случае это четко идентифицируется через EventType.Например.Упражнение, PumpSuspended.(Между прочим, я предполагаю, что пациент знает только фактические, а не запланированные атрибуты, в конце периода упражнения.)

      • Так как обычно нет EndDateTime,StartDateTime это просто DateTime.Например.EventDtm

      • Это требует использования обычных подзапросов SQL.Это на самом деле довольно просто, когда кодер понимает предмет.Для тех, кто этого не делает, я предоставил полный учебник по подзапросам в целом и, в частности, использовал их во временном контексте:

      ▶Легко, когда ты знаешь, как ◀ .Не случайно, что та же самая классическая временная база данных 5NF выше.

    • XOR у вас есть база данных с EndDateTime (100% дублирование) с каждым StartDateTime столбец, и вы можете использовать плоские, медленные запросы.Много манипулирования большими результирующими наборами с помощью GROUP BY, вместо маленьких результирующих наборов.Массовое дублирование данных и обновление аномалий были введены, уменьшая базу данных до простого файла, чтобы обеспечить потребности кодировщиков с ограниченными возможностями (конечно, не "простота кодирования").

    • Поэтомувнимательно рассмотрите и выберите только на длительный срок, поскольку это влияет на каждый сегмент кода, обращающийся к временным данным.Вы не хотите переписывать на полпути, когда понимаете, что поддержание аномалий обновления хуже, чем написание подзапросов.

      • Конечно, я предоставлю явные требования для поддержки 5NFВременная база данных, правильные типы данных и т. Д., Чтобы поддержать все ваши установленные требования.

      • Далее, если вы выберете 0NF, я предоставлю эти поля, чтобы модель данных была полна для ваших целей.

      • В любом случае вам необходимо точно определить код SQL, необходимый для любого данного запроса.

  11. Важна обработка DataType.Не храните время (часы и т. Д.) Как целое число или смещение.Сохраните его только как время или тип данных.Если смещение, сохраните его как Время с полуночи .Это позволит использовать неограниченные функции SQL и арифметики дат.

  12. Задача для вас.Внимательно просмотрите модель и убедитесь, что:

    • каждый неключевой атрибут имеет отношение 1 :: 1 со своим первичным ключом

    • и о том, что он не имеет отношения к любому другому ПК (в некоторой другой таблице)

    И, конечно, проверьте модель и предоставьте обратную связь.

Вопрос

С учетом приведенных выше объяснений и указаний.

  • Что такое ReadingBasalTemperature.Type, перечислите значения, пожалуйста?

  • Что такое HbA1C?

  • Что такое KeyTone?

  • Нужно ли нам (т.е.Duration / Period EndDateTime`):

    • ReadingBasalTemperaEnd
    • ReadingBolusEnd
    • Базальный паттерн
    • Базальный паттерн
    • Собственно, чтотакое шаблон, и как он получается / сравнивается?
  • Как определяется значение BasalTemperaEnd (или Duration)

  • Исходная позиция: нет необходимости сохранять активную длительность инсулина.Но вам нужно определить, как определяется EndDateTime.Исходя из этого, если это не может быть легко получено, или если оно основано на слишком многих факторах или изменениях все время, сохранение EndDateTime может быть хорошим.

  • Требуются настройки насосауточнение.

V1.2

Хорошо, я включил всю информацию, которую вы доказали в вопросе и комментариях.Вот прогрессивная модель данных.

▶ Модель данных события V1.2 ◀

Есть еще некоторые проблемы, которые необходимо решить.

  • Используйте только процент или процент, но не оба с дополнительным индикатором. Одно может быть получено из другого. Я использую курс последовательно.

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

    • Это не "избыточность". Это хранение временного ряда фактов, которые оказываются неизменными. Требуемые запросы просты.

    • Однако при расширенном использовании, да, вы можете избежать сохранения неизменного факта и вместо этого увеличить продолжительность, включив новый интервал времени.

  • Мне все еще не ясно, как вы объясняете Базальскую Темп. Пожалуйста, изучите новую модель. Во-первых, шаблоны теперь хранятся отдельно. Во-вторых, мы записываем начальный темп старта со скоростью. Нужен ли нам базальный темп (с тарифом)?

  • «GlucoseEventType мог бы иметь более одного значения на результат глюкозы» нуждается в большем определении. Не беспокойтесь о ID ключах. Просто расскажите мне о данных. Для каждого ReadingGlucoseBlood назовите значения результатов и тип GlucoseEventType, к которому они применяются; которые являются обязательными и которые являются необязательными.

  • PumpHistory.InsulinEndDateTime - конечное мгновение для Длительности. Конечно, это общее, начальный Мгновенный - это строка, с которой вы сравниваете. Таким образом, с полуночи 01 января 1900 года должны быть секунды или минуты.

  • Проверьте новое событие PK. Если входящая запись идентифицирует несколько событий, вам необходимо проанализировать это и вставить каждую строку Event-EventSubtype, используя тот же DateTime.

  • За исключением пациента, в этой базе данных нет ключей ID, пока они не требуются. Обратитесь к родителю по полной PK.

05 фев. 11

Нет отзывов о версии 1.2.

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

Это легко преодолеть. Однако это означает, что Мгновенное действие не является Мгновенным . Теперь я могу провести вас через все упражнение, но суть проста.

  • Если вам это действительно нужно, мы можем добавить SequenceNo на ПК, чтобы сделать его уникальным. Но я подозреваю, что EventTypeCode достаточно (будет не более одного EventType в секунду). Если нет, дайте мне знать, и я поменяю моэль.

  • Сохраните значение Мгновенного как Мгновенное и, таким образом, избегайте отклонений от архитектурных требований временных баз данных.

  • Используйте EventType, чтобы придать уникальность DateTime Pk.

    • Имейте в виду, что EventTypeCode развернут в Event PK, не как требование дискриминатора, а для обеспечения уникальности. Таким образом, его присутствие в PK Подтипов является артефактом, а не Дискриминатором (который уже известен в силу Подтипа).
  • Однако из-за неисключительного подтипа возникает ненужная сложность (может быть более одного подтипа на строку супертипа).

  • Поэтому я изменил его обратно на эксклюзивный подтип, детерминированный. Один EventType для строки Supertype; макс один подтип.

См. Реализация ссылочной целостности для подтипов для получения конкретной информации об ограничениях и т. Д.

Изменение в модели данных слишком мало, чтобы гарантировать другой выпуск. Я обновил модель данных V1.2.

06 марта 11

Из-за того, что я придерживался принципа «прежде всего, будь технически честным» в FAQ и столкнулся с дезинформацией в соответствии с просьбой, я был отстранен от работы (что означает, что я больше не буду исправлять дезинформацию на SO, и такие плакаты защитили правила).Взаимодействие с ищущим было продолжено, до завершения, и окончательная модель данных была завершена, вдали от SO.Прогрессия поэтому потеряна для ТАКИХ читателей.Однако может быть полезным опубликовать результат, ▶ Итоговая модель данных V1.16 ◀ .

  • События всегда имеют начальный Мгновенный (Event.DateTime).
  • События могут быть Длительностями, в этом случае требуется конечный Мгновенный (Событие).
  • Некоторые события состоят только из супертипа;другие требуют подтипа.Это указано в третьем столбце экспозиции EventType.
  • В четвертом столбце указан тип события:
    • Мгновенное или Длительность
    • Длительность: конъюнкт или дизъюнкт
  • Обратите внимание, что разрешение DateTime на платформе искателя составляет одну секунду, и многие события могут происходить в одну секунду, но не более одного и того же EventType.Поэтому EventTypeCode был включен в первичный ключ события для реализации этого правила.Таким образом, это артефакт, это не общее требование для структуры подтипа супертипа или для исключительных / неисключительных подтипов.
  • Предназначен для печати на двух обращенных страницах Письма США, увеличенных или нет, со складкой.
4 голосов
/ 26 января 2011

Нет, после того, как вы скажете что-то вроде "подавляющее большинство полей останутся пустыми для многих записей", ваша схема почти наверняка сломана.

Глюкоза в крови должна быть в отдельной таблице, не более чем дата / время и уровень. Потребление пищи аналогично, если вы просто храните содержание углеводов. Если вы храните отдельные компоненты еды, между таблицей приема пищи и таблицей компонентов питания должна быть взаимосвязь один ко многим.

То же, что и инсулин, с отметкой времени и количеством.

Правильный способ представления отношений между разнородными объектами - это, в общем, отношения: внешние ключи и тому подобное.


И, кроме того, как "ничего не делать с сторонним программированием" (при смешивании событий), если вы принимаете инсулин и едите в в то же время, вы, вероятно, делаете это неправильно. Большинству быстродействующего инсулина для правильной работы требуется полчаса, и пища, поступающая в ваш кишечник, начнет производить сахар примерно через пять-десять минут. Так что между съемкой и приемом пищи должна быть задержка примерно на полчаса.

Единственными обычными событиями «с одинаковой отметкой времени или около того», о которых я знаю, является уровень сахара в крови непосредственно перед едой, чтобы гарантировать, что инсулин, который вы вводили полчаса назад, начал работать.

Но я не твой эндокринолог и даже не играю по телевизору :-) Так что сначала посоветуйся со своими врачами.


2 голосов
/ 27 января 2011

«Я склоняюсь к тому, что лучше всего иметь несколько таблиц с тесно связанными типами информации, а не одну таблицу со всем и большим количеством места ... но я не совсем уверен, как действовать».

Простой и лучший. Чтобы понять почему, мы можем рассмотреть альтернативы.

Одна таблица на показатель. Полностью нормализованный, но невероятно утомительный. Я обычно ястреб по нормализации, а также я обычно говорю «таблицы свободны», это не совсем верно, когда они начинают исчисляться десятками или сотнями для подобных вещей. Поэтому мы бы предпочли что-нибудь попроще.

На другом конце у нас есть E-A-V, одна таблица со значениями, такими как test_id, metric_id, value. Общеизвестно, что практически невозможно запросить и работать с ним. Как мухоловка Венеры, притягивает вас сладко пахнущим нектаром, затем закрывает вас и съедает.

На захватной руке есть одна большая таблица со всеми возможными столбцами. Это называется «разреженным» решением по очевидным причинам. Я делал это в Direct Marketing, и это хорошо работает, но это была узкоспециализированная ситуация, такой подход обычно не рекомендуется.

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

Хмммм, это как раз то, что вы предложили. Звучит хорошо!

0 голосов
/ 26 января 2011

Взгляните на следующие примеры SO: один , два , три , четыре .

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