У меня есть несколько разных типов компонентов, каждый из которых имеет радикально разные спецификации данных для хранения, поэтому каждому типу компонента нужна своя собственная таблица, но все они имеют общие столбцы. Меня больше всего волнует [component.ID], который должен быть уникальным идентификатором компонента независимо от типа компонента (уникальным для многих таблиц).
Первый вариант
Моей первой идеей было наследование, когда таблица для каждого типа компонента наследует общую таблицу [component].
create table if not exists component (
ID long primary key default nextval('component_id_seq'),
typeID long not null references componentType (ID),
manufacturerID long not null references manufacturer (ID),
retailPrice numeric check (retailPrice >= 0.0),
purchasePrice numeric check (purchasePrice >= 0.0),
manufacturerPartNum varchar(255) not null,
isLegacy boolean default false,
check (retailPrice >= purchasePrice)
);
create table if not exists motherboard (
foo long,
bar long
) inherits component; //<-- this guy right here!!
/* there would be many other tables with different specific types of components
which each inherit the [component] table*/
PostgreSQLУ наследования есть некоторые предостережения, которые, кажется, делают это плохой идеей.
Ограничения типа unique
или primary key
не соблюдаются таблицей наследования. Даже если вы укажете unique
в таблице наследования, она будет уникальной только в этой таблице и может дублировать значения в родительской таблице или других таблицах наследования.
Ссылки не переносятся изродительская таблица. Поэтому ссылки на typeID
или manufacturerID
не будут применяться к таблице наследования.
Ссылки на родительской таблицы не будут включать данные в таблицы наследования,Это наихудшее прерывание сделки для меня, использующего наследование, потому что мне нужно иметь возможность ссылаться на все компоненты независимо от типа.
Второй вариант
Если я не использую наследование и просто использую таблицу component
в качестве основного списка компонентов с данными, общими для любого компонента любого типа, а затем создаю таблицу для каждого типа компонента, где каждая запись ссылается на component.ID
. это прекрасно работает, но как мне обеспечить это?
Как сделать так, чтобы у каждой записи в таблице component
была одна и только одна соответствующая запись только в одной из многих других таблиц? Меня беспокоит то, что существует многотаблицы и соответствующие записи могут быть в любой из них.
Простая ссылка на таблицу component
гарантирует, что у каждой строки во многих таблицах определенных типов компонентов есть одна действительная component.id
, к которой она принадлежит.
Третий вариант
Последнее, что я мог бы вообще отказаться от основной таблицы компонентов, и просто иметь каждую таблицу для определенного типа компонента с теми же столбцами. Затем у меня остается загадка, как применять уникальный идентификатор компонента во многих таблицах, а также как выполнять поиск во всех этих многих таблицах (которые могут очень хорошо расти или уменьшаться) в запросах. Я не хочу огромный громоздкий СОЮЗ между всеми этими столами. Это может привести к тому, что любой запрос на выборку будет зависеть от скорости замороженной патоки.
Четвертый вариант
Мне кажется, что проблема, которая время от времени возникает, связана с разработкой БД ивозможно, это название, которое я не знаю, и, возможно, решение, которое полностью отличается от трех указанных выше вариантов.