дизайн схема выглядит хорошо для меня, по крайней мере, на основе информации, которую вы дали в этом и предыдущем посте. Лучшая практика - начать с нормализованного дизайна, а затем де-нормализовать, где, по вашему мнению, требуется оптимизация запросов. Я предполагаю, что база данных не будет массивной или иметь высокий уровень транзакций, поэтому производительность не должна быть проблемой, поэтому я бы придерживался нормализованного дизайна. Как правило, денормализация может быть целесообразной, если вам нужно писать запросы, которые объединяют более 4 таблиц (по крайней мере, в sql-сервере), но я не могу видеть, что это происходит с этим дизайном схемы.
Как вы можете предположить в своем вопросе, таблицы формы и образца могут быть кандидатами на денормализацию, включая атрибуты для обеих в таблице DataCollection, но это будет зависеть от того, сколько других атрибутов Form и Sample имеют и сколько из них являются общими для обоих ,
Один совет, который я бы дал, - это рассмотреть вопрос о том, чтобы предоставить таблице формы первичный ключ, который является короткой символьной строкой, если у вас есть довольно стандартные формы, которые, как я считаю, облегчают жизнь при просмотре таблиц (например, немного напоминает формы HMRC P45 , P60 и т. Д. Или коды аэропортов LHR, JFK и т. Д.), Так как вам не нужно продолжать присоединяться к другим таблицам, чтобы помнить, к какой форме относится конкретный идентификатор int. Поле CHAR (3) также использует меньше памяти, чем INT. Это может относиться к другим таблицам, таким как DataCollectionType. Но это, вероятно, вопрос личных предпочтений.
Из нашего обсуждения в предыдущем столбце таблица данных DataFrequency, о которой мы говорили, вероятно, должна быть ссылкой «много-1» в таблице DataCollection. Возможно, DataCollectionIntervals может быть лучшим именем для него.
Еще одна вещь, о которой стоит подумать в дизайне, заключается в том, выиграют ли таблицы с частой доступностью до вертикального разделения. Под этим я имею в виду, если таблица имеет широкие ряды, т.е.множество атрибутов или голодных атрибутов хранения, таких как VARCHAR (MAX), которые редко доступны, можно разделить на отдельную таблицу со ссылкой 1-1, которая может значительно улучшить производительность запросов, связанных с этой таблицей. Но, как я уже сказал, я не вижу, чтобы производительность была проблемой с размером базы данных, которую вы планируете, и предполагая, что вы будете использовать что-то вроде SQL Server.
И последнее: структура Forms может быть немного сложнее, чем схема в настоящее время указывает, например, формы обычно разбиваются на несколько разделов, и требуемые типы вопросов могут быть довольно сложными, например. множественный выбор, текст, ветвление, условный. Также формы могут существовать в разных версиях (используйте флаг «Актив» для идентификации текущей активной версии в таблице «Формы»). Я посмотрел на использование самого queXML для разработки вопросника в XML, но решил, что он немного переборщил за то, что мне было нужно, поэтому я решил использовать более простую схему XML, которая может быть импортирована в базу данных.
Я отредактировал вопрос по вашему предложению. – user2188687
Выглядит в основном нормально для меня. Только эти пункты: 1) Необходима ли таблица DataItemSchedule? Очевидно, что если вы редактируете расписание, это влияет на все DataCollections, связанные с этим расписанием, если это то, как он должен работать, тогда хорошо, но если ваше просто редактирование для этого DataCollection, возможно, лучше не иметь его и дублировать записи в таблице ференции. –
2) Стол пациента выглядит длинным набором ссылок в стороне от таблицы вопросов. Я предполагаю, что общий запрос состоял бы в том, чтобы отследить ответы на вопросы для конкретного пациента. Если у вас была таблица PatientAnswer вместо ClinicVisitAnswered с дополнительной ссылкой на таблицу ClinicVisit, которая была бы более быстрой и более гибкой (например, пациент мог бы отправлять ответы без посещения клиники - если протокол меняется) –