我正在开发一个金融数据应用程序,我想在其中跟踪不同类型的证券(股票、期权、期货、债券等)和相应的每日报价。目前,我为每种类型的安全性都有一个单独的表,例如对于股票,表格如下所示:
CREATE TABLE stock (
ticker VARCHAR PRIMARY KEY,
name VARCHAR NOT NULL,
exchange VARCHAR
);
问题是,某些类型的证券依赖于其他类型的证券。例如,期权基于标的股票、期货、债券,甚至其他期权;与期货类似。 这是我现在拥有的,带有一个尝试弥合这些关系的链接表:
CREATE TABLE option_map (
id INTEGER PRIMARY KEY,
underlying_type SecurityType NOT NULL,
stock_ticker VARCHAR REFERENCES stock(ticker),
future_id INTEGER REFERENCES future(id),
bond_cusip VARCHAR REFERENCES bond(cusip)
CHECK ((stock_ticker NOT NULL)::INTEGER + (future_id NOT NULL)::INTEGER
+ (bond_cusip NOT NULL)::INTEGER = 1)
);
CREATE TABLE option (
id INTEGER PRIMARY KEY,
underlying INTEGER REFERENCES option_map(id) NOT NULL,
option_type OptionType NOT NULL,
strike_price DECIMAL NOT NULL,
strike_date DATE NOT NULL
);
但是,此解决方案不允许在选项上有选项,即表
option_id INTEGER REFERENCES option(id)
中的列 option_map
,因为这会创建 StackOverflow 参与者似乎不喜欢的循环引用。
我想要的(希望这在duckdb中是可能的)是一个主表,其中包含每个跟踪的证券,该表既可用于上述映射问题,也可用于将报价(单独的表)与底层证券相关联:
CREATE TABLE security (
id INTEGER PRIMARY KEY,
underlying_type SecurityType NOT NULL,
stock_ticker VARCHAR REFERENCES stock(ticker),
option_id INTEGER REFERENCES option(id),
future_id INTEGER REFERENCES future(id),
bond_cusip VARCHAR REFERENCES bond(cusip)
CHECK ((stock_ticker NOT NULL)::INTEGER + (option_id NOT NULL)::INTEGER
+(future_id NOT NULL)::INTEGER + (bond_cusip NOT NULL)::INTEGER = 1)
);
我对数据库设计比较陌生;任何有关如何进行的提示将不胜感激,提前致谢。
我会尝试将每种金融工具拆分成一个单独的表,并在表之间建立关系。
从概念上讲,它看起来像这样。
CREATE TABLE stocks
(
id INTEGER PRIMARY KEY
/* other attributes */
);
CREATE TABLE stock_options
(
id INTEGER PRIMARY KEY,
stock_id INTEGER NOT NULL REFERENCES stocks (id),
kind OptionKind NOT NULL,
strike_price DECIMAL NOT NULL,
strike_date DATE NOT NULL,
/* other attributes */
UNIQUE (stock_id, kind, strike_price, strike_date)
);
CREATE TABLE options_on_stock_options
(
id INTEGER PRIMARY KEY,
stock_option_id INTEGER NOT NULL REFERENCES stock_options (id),
kind OptionKind NOT NULL,
strike_price DECIMAL NOT NULL,
strike_date DATE NOT NULL,
/* other attributes */
UNIQUE (stock_option_id, kind, strike_price, strike_date)
);
/* By analogy for bonds, bond options, options on bond options, etc. */
附注我不是金融工具领域的专家,所以这可能是我第一次听说期权之类的金融工具。但使用上述方法,您完全可以实现它们。