SQL:如何避免或处理循环表引用?

时间:2020-08-30 18:19:03

标签: sql

我正在尝试以SQL金融资产(股票,债券,现金等)为模型,并将这些资产中的每一种都以对应的货币(美元,加元等)为模型。

按照我的建模方式,货币具有指向货币交换资产(即https://finance.yahoo.com/quote/cadusd=x/)的“可使用资产”,因此我可以将每个值归一化为一种货币,但这会形成一个循环依赖性。

这是快速的sqlalchemy布局,尽管我的问题不一定与SQLAlchemy有关:

class Currency(Model):
    id              = Column(Integer, primary_key=True)
    name            = Column(String(256), nullable=False)
    to_usd_asset    = relationship('Asset')

class Asset(Model):
    id                      = Column(Integer, primary_key=True)
    name                    = Column(String(256), nullable=False)
    symbol                  = Column(String(256))
    currency                = relationship('Currency')

我喜欢这种布局,因为它意味着用户持有现金,股票,债券或仅持有“资产”的任何东西,并且我可以看到一种快速简便的方法来编写将所有值都转换为美元的查询(以及从那里到用户可能会关心的任何其他货币)。但是循环依赖会导致一些问题,包括编写棘手的插入查询,sqlalchemy在启动时抱怨它等等。

有没有一种更好的餐桌设计可以容纳我所需要的东西?

2 个答案:

答案 0 :(得分:-1)

嗯,我不喜欢这种模型-做类似的事情,我认为这过于简单了。不错-如果符合您的需求,那就好。并非所有人都必须处理以其他资产报价的资产,然后再以多种可能的货币之一报价。

针对您的情况的简单解决方案:to_usd_asset可为空。显然,如果它为null,那么您就有一个要评估美元汇率的问题,但是该简单的解决方法可以处理所有新货币插入。而且没有to_usd_asset的货币-嗯,这种情况在插入期间是一种极端情况。随着NULL在SQL中的传播,如果最终的估值应该是数字而不是数字,那么您可能会抛出错误。

答案 1 :(得分:-1)

我不是财务结构及其运作方式的专家。 但是从直觉上讲,我会在货币和资产之间建立一种n-m关系

类似以下内容(我不知道SQLAlchemy的伪代码)

Table Currency
    id     number not null PK
    name   varchar(256)


Table Asset
    id    number not null PK
    name   varchar(256)
    symbol varchar(256)

Table currency_asset
   currency_id number not null references currency,
   asset_id number not null references asset
   constraint currency_asset_pk primary key(currency_id, asset_id)

这使您在关联和查询简便性方面具有很大的灵活性。您不必介意某些引用是否可以为空,并且甚至不必强制仅将货币与美元兑换资产相关联。

如果您还需要了解某个关系是货币的变化,则可以在该关系本身中添加标记,或者在资产中添加字段类型。