У вас есть несколько фондов и несколько классов активов. Каждый фонд может иметь несколько активов, и каждый актив может использоваться несколькими фондами. Это классическое c отношение «многие ко многим» , и лучше всего оно представлено в виде таблицы, объединяющей средства и активы с использованием соединительной таблицы , не пытаясь объединить все в одну таблица, как вы видите.
Идея состоит в том, чтобы иметь таблицу, описывающую средства (Имя, дата основания, сборы и т. д. c.), таблицу, описывающую классы активов, и третью таблицу, которая связывает два и содержат, сколько средств фонда выделено для этого класса активов, используя первичные ключи двух других таблиц в качестве внешних ключей.
Пример базы данных и некоторые примеры данных:
CREATE TABLE investment_fund(id INTEGER PRIMARY KEY, name TEXT UNIQUE);
CREATE TABLE asset_class(id INTEGER PRIMARY KEY, name TEXT UNIQUE);
CREATE TABLE investment_percentages(
fund_id INTEGER REFERENCES investment_fund(id),
asset_id INTEGER REFERENCES asset_class(id),
percentage REAL,
PRIMARY KEY(fund_id, asset_id)) WITHOUT ROWID;
CREATE VIEW fund_ownership AS
SELECT fund_id, if.name AS fund_name, asset_id, ac.name AS asset_name
, percentage
FROM investment_fund AS if
JOIN investment_percentages AS i ON if.id = i.fund_id
JOIN asset_class AS ac ON i.asset_id = ac.id;
INSERT INTO investment_fund VALUES (1, 'No Bonds Here');
INSERT INTO investment_fund VALUES (2, 'We Do Bonds');
INSERT INTO asset_class VALUES (1, 'Municipal Bond Market');
INSERT INTO asset_class VALUES (2, 'REIT');
INSERT INTO asset_class VALUES (3, 'S&P500 Index');
INSERT INTO investment_percentages VALUES (1, 2, 40);
INSERT INTO investment_percentages VALUES (1, 3, 60);
INSERT INTO investment_percentages VALUES (2, 1, 75);
INSERT INTO investment_percentages VALUES (2, 3, 25);
затем Вы можете получить список всех классов, принадлежащих конкретному фонду, и только тех, без необходимости заранее знать, что они из себя представляют:
sqlite> SELECT * FROM fund_ownership WHERE fund_name = 'We Do Bonds' ORDER BY percentage DESC;
fund_id fund_name asset_id asset_name percentage
---------- ----------- ---------- --------------------- ----------
2 We Do Bonds 1 Municipal Bond Market 75.0
2 We Do Bonds 3 S&P500 Index 25.0