Я предполагаю, что все плагины имеют набор базовых атрибутов, и тогда каждый плагин будет иметь набор специфичных для плагина атрибутов. В этом случае вы можете использовать одну таблицу вместе с типом данных hstore
(стандартное расширение, которое просто необходимо установить).
Примерно так:
CREATE TABLE plugins
(
plugin_name text not null primary key,
common_int_attribute integer not null,
common_text_attribute text not null,
plugin_atttributes hstore
)
Тогда вы можете сделать что-то вроде этого:
INSERT INTO plugins
(plugin_name, common_int_attribute, common_text_attribute, hstore)
VALUES
('plugin_1', 42, 'foobar', 'some_key => "the fish", other_key => 24'),
('plugin_2', 100, 'foobar', 'weird_key => 12345, more_info => "10.2.4"');
Это создает два плагина с именами plugin_1 и plugin_2
Plugin_1 имеет дополнительные атрибуты «some_key» и «other_key», в то время как plugin_2 хранит ключи «weird_key» и «more_info».
Вы можете индексировать эти hstore
столбцы и очень эффективно запрашивать их.
Далее будут выбраны все плагины, для которых определен ключ «weird_key».
SELECT *
FROM plugins
WHERE plugin_attributes ? 'weird_key'
Следующий оператор выберет все плагины, которые имеют ключ some_key
со значением the fish
:
SELECT *
FROM plugins
WHERE plugin_attributes @> ('some_key => "the fish"')
На мой взгляд, гораздо удобнее, чем использовать модель EAV (и, скорее всего, намного быстрее).
Единственным недостатком является то, что вы теряете безопасность типов при таком подходе (но обычно вы теряете это и с концепцией EAV).