Это пример моделирования наследования в реляционной базе данных.
У вас есть абстрактная сущность - "наблюдение" - со свойствами zone
, year
и month
, конкретные сущности "Temperature_observation" с атрибутом "температура" и сущность "осадки" с "кубической"метров».
Этот ТАК вопрос описывает доступные варианты - ни один из них не является особенно чистым.Ваш вариант 1 - «таблица на подкласс».
Ваш вариант 2 не является одним из распространенных решений;он доступен для вас, потому что ваши данные, очевидно, имеют только 2 атрибута - количество (числовое) и единицу измерения.Это не обычная ситуация.
Вариант 3 - «наследование одной таблицы».Это общий шаблон проектирования, который обычно работает, если у вас ограниченное количество подклассов;как только вы получаете много подклассов, это становится довольно трудно понять.
Следующее, что вам нужно рассмотреть, это то, как вы будете запрашивать эти данные.Это вопрос «вернуть все записи за определенный период / бассейн»?В этом случае это не имеет большого значения - оба ваших варианта хороши.
Если вы хотите использовать базу данных для более сложных запросов -
, в каком месяце была температурасамый высокий и самый низкий уровень осадков?
какова средняя температура в бассейнах, где количество осадков составляет не менее х?
- , тогда вы можете пожелать "читабельность" своих запросов.
На мой взгляд, вариант 1 довольно понятен - любой, кто просматривает ваши запросы к базе данных, сразу поймет, что вы спрашиваете.Вы будете присоединяться к вещам, которые определяют проблемную область - бассейн, год, месяц.
Варианты 2 и 3 требуют самостоятельных объединений, которые могут стать довольно сложными и трудными для чтения по мере усложнения условий.
Например, вопрос what's the average temperature in basins where precipitation is at least x?
в варианте 1:
select avg(temperature)
from temperature_facts
where basin_id in
(select basin_id
from precipitation_facts
where precipitation > ?)
В варианте 2 это становится:
select avg(value)
from facttable
where indicator = 'temperature'
and basin_id in
(select basin_id
from fact_table
where value > ?
and indicator = 'precipitation')
В варианте 3 это что-то вроде
select avg(temperature)
from fact_table
where basin_id in
(select basin_id
from fact_table
where precipitation > ?)
Лично я нахожу вариант 1 более выразительным,но это вопрос предпочтений.