SQL:如何避免或处理循环表引用?
我试图在SQL金融资产(股票、债券、现金等)中建模,并将这些资产中的每一项作为相应的货币(美元、加元等) 按照我建模的方式,货币有一个“对美元资产”,它指向一个货币交换资产(即),因此我可以将每个值标准化为一种货币,但这会产生循环依赖 下面是快速sqlalchemy布局,尽管我的问题不一定与sqlalchemy相关:SQL:如何避免或处理循环表引用?,sql,Sql,我试图在SQL金融资产(股票、债券、现金等)中建模,并将这些资产中的每一项作为相应的货币(美元、加元等) 按照我建模的方式,货币有一个“对美元资产”,它指向一个货币交换资产(即),因此我可以将每个值标准化为一种货币,但这会产生循环依赖 下面是快速sqlalchemy布局,尽管我的问题不一定与sqlalchemy相关: class Currency(Model): id = Column(Integer, primary_key=True) name
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在启动时对此抱怨,等等
有一个更好的表格设计仍然适用于我所追求的吗?< / P> < P>嗯,我不喜欢这个模型-做一些类似的事情,我会认为这过于简单化。换句话说,如果它符合你的需要,好。不是每个人都必须处理其他资产中引用的资产,然后引用多个可能的货币中的一个。p>
对于您的情况,简单的解决方案是:to_usd_资产可以为null。显然,如果它为null,那么您在评估以美元为单位的汇率时会遇到问题,但是这个简单的修复程序会处理所有新货币的插入。而且,没有to_usd_资产的货币在插入过程中是一种边缘情况。当null在SQL中传播时,您可能会抛出错误或者得出的估值应该是一个数字,但不是。我不擅长金融结构及其运作方式。 但直觉上,我会在货币和资产之间建立一种n-m关系 类似于以下内容(伪代码,因为我不知道SQLAlchemy) 这使您在关联和查询方便性方面具有很大的灵活性。您不介意某些引用是否为空,甚至不必将货币仅与美元兑换资产关联
如果在plus中,您需要知道关系是货币的变化,您可以在关系本身或资产中添加标志或字段类型。这绝对不是他想要的,因为给定资产只有一种报告货币。因此,它不是m:n。资产是报价的(他要求的是时间序列定义,而不是资产定义)单位(在他的例子中是货币)。一个时间序列总是且仅以一个单位报价,否则你将不知道价格指的是什么。不,如果你有多个报价,它也不是m:n,因为你可能在不同的市场中多次使用相同的货币。OP模型过于简单化(可能适合他的需要)-你的模型不幸不适合。
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)