ある親子のあるデータ構造があって、親は滅多に増えないけれど、いつかは増える場合があるという時に、子供の構造に親への参照を入れればいいじゃんと思って提案したら
「全てを集約する一覧表が欲しいんだ。その子構造に親ごとのカラムをとりあえず10個入れてくれ」と言われてしまった場合の対応として『一覧表が欲しければその度にクエリーを投げるか、ヴューにすれば?』という回答をしたいと思う。
以下あんまり効率よくなさそうだけどサンプル。serial 以外は大体の RDBMS でいけると思う。
-- 親。たまにしか増減しないが増減の可能性が考えられる CREATE TABLE bags ( id SERIAL NOT NULL, name VARCHAR(1000) NOT NULL, PRIMARY KEY(id) ); -- 子。動的に増減する CREATE TABLE items ( id SERIAL NOT NULL, bag_id INT NOT NULL, key VARCHAR(1000) NOT NULL, value VARCHAR(1000) NOT NULL, PRIMARY KEY(id), UNIQUE (bag_id, key) ); -- サンプルデータ INSERT INTO bags(name) VALUES ('ohukuro'), ('kobukuro'), ('warai-bukuro'); INSERT INTO items(bag_id, key, value) VALUES (1, 'size', '10'), (2, 'size', '1'), (3, 'size', '0'); INSERT INTO items(bag_id, key, value) VALUES (1, 'magic-power', '100'), (3, 'magic-power', '16'); INSERT INTO items(bag_id, key, value) VALUES (1, 'money', '0'), (2, 'money', '99999'), (3, 'money', '32'); -- 一覧表のヴュー。bag が増えたらカラムを付け足す。 CREATE OR REPLACE VIEW bag_view AS SELECT items.key, (SELECT it.value FROM items it WHERE it.bag_id = (SELECT id FROM bags WHERE name = 'ohukuro') AND it.key = items.key) AS "Ohukuro", (SELECT it.value FROM items it WHERE it.bag_id = (SELECT id FROM bags WHERE name = 'kobukuro') AND it.key = items.key) AS "Kobukuro", (SELECT it.value FROM items it WHERE it.bag_id = (SELECT id FROM bags WHERE name = 'warai-bukuro') AND it.key = items.key) AS "WaraiBukuro" FROM items GROUP BY items.key ;
これで一覧表にはなると思う。