Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL:如何避免或处理循环表引用?_Sql - Fatal编程技术网

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

SQL:如何避免或处理循环表引用?,sql,Sql,我试图在SQL金融资产(股票、债券、现金等)中建模,并将这些资产中的每一项作为相应的货币(美元、加元等) 按照我建模的方式,货币有一个“对美元资产”,它指向一个货币交换资产(即),因此我可以将每个值标准化为一种货币,但这会产生循环依赖 下面是快速sqlalchemy布局,尽管我的问题不一定与sqlalchemy相关: class Currency(Model): id = Column(Integer, primary_key=True) name

我试图在SQL金融资产(股票、债券、现金等)中建模,并将这些资产中的每一项作为相应的货币(美元、加元等)

按照我建模的方式,货币有一个“对美元资产”,它指向一个货币交换资产(即),因此我可以将每个值标准化为一种货币,但这会产生循环依赖

下面是快速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在启动时对此抱怨,等等


有一个更好的表格设计仍然适用于我所追求的吗?< / 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)