在duckdb中使用循环引用绕过链接表

问题描述 投票:0回答:1

我正在开发一个金融数据应用程序,我想在其中跟踪不同类型的证券(股票、期权、期货、债券等)和相应的每日报价。目前,我为每种类型的安全性都有一个单独的表,例如对于股票,表格如下所示:

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)
);

我对数据库设计比较陌生;任何有关如何进行的提示将不胜感激,提前致谢。

sql database-design duckdb
1个回答
0
投票

我会尝试将每种金融工具拆分成一个单独的表,并在表之间建立关系。

从概念上讲,它看起来像这样。

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. */

附注我不是金融工具领域的专家,所以这可能是我第一次听说期权之类的金融工具。但使用上述方法,您完全可以实现它们。

© www.soinside.com 2019 - 2024. All rights reserved.