Jam*_*ell 5 ms-access database-design
我正在尝试在 Microsoft Access 中创建一个结构化数据库来监控交易风险。假设一个组织想要分析它在任何给定时间点的账簿中的所有交易。在这种情况下,交易将是用某种形式的抵押品交换货物。抵押品可以是股票、股票、债券现金等……基本上是具有可交易价值的东西。
每笔交易都有自己独特的一套限制。例如,构成每笔交易的证券(抵押品)只能是来自批准指数(NDX 指数、HSI 指数等...)的股票。另一个例子可能是每个证券最多可以弥补交易金额的 10%。
当交易数据导入数据库时,我想标记或提取所有违反每笔交易唯一限制的交易。我不一定要删除交易记录,但我想可能将它们分组到一个单独的表中以便于查看。
我附上了一张带有问题表的(简化的)建议数据库模式的图片。假设我想对特定交易可以接受的可接受指数设置限制。对于此索引限制示例,数据库模式的结构是否正确,以便创建检查给定交易的查询:可接受索引的限制由 80% 主要和 20% 次要索引和这些索引组成,我想要仅限于西班牙和日本的索引?
如果与给定交易相关的证券每天都在变化,我想确保该特定交易中的所有这些新证券都遵循对交易施加的每个限制。在这种情况下,对可接受指数的限制,但是不同的交易可能不仅针对指数,而且针对集中度等都有一组不同的限制。我不想为每笔交易编写唯一的查询(例如,我可能希望不同交易的证券在主要指数中为 100%,并且所有指数均来自美国)。
如果该交易中包含的证券违反了特定交易的指数、集中度、批准国家等的限制,那么我希望向用户标记这些特定交易。
注意:我一直在探索将所有限制作为每笔交易的属性的选项,但我不知道如何创建一个通用的查询结构,允许我在不创建大量查询的情况下识别限制违规。
任何建议将不胜感激。
初步观察发现,指数类型和指数构成是指数的属性,而不是 Acceptable_indices 的属性。证券和指数之间存在关系;从当前信息无法确定这对您的用例是否重要。浓度应该与另一种实体类型相关,说明它是的浓度。
更一般地说,您需要区分可接受的值集和执行的事务中实际值。可接受的集合是以标准化数据模型的形式记录的风险和暴露策略。你必须仔细考虑所有的情况,包括晦涩的、罕见的和特殊的情况。对于每笔执行的交易,模型必须捕获足够的信息来确定其是否符合风险策略。
单个交易和适用于该交易的规则集之间必须存在联系。最简单的方法是按证券类型设置规则,例如一套债券、一套股票、一套期货、一套期权等。
另一个复杂之处是数据的时间依赖性。我猜这个应用程序将用于交易完成后的分析,而不是交易前的授权。交易和分析之间可能需要几天的时间。因此,您需要知道交易发生时有哪些规则。所有内容都必须有开始日期和结束日期(或日期时间值,具体取决于事情是否可以在当天发生变化)。
对于物理数据库设计,您可以为每个实体类型实现一个表。在缺乏强烈动机的情况下,这是通常的做法。这种方法的查询可能会更长(如果有许多限制因素,查询将必须引入具有限制允许值的表以及包含每个因素的实际执行值的表)。然而,查询非常明显,并且易于实现和维护。运行时引擎执行它们应该没有问题。
或者,每个限制都可以被视为交易的一个特征。这些表简化为特征值袋。要检查已执行的交易是否超出限制,请将“允许”的值包与“已执行的”值包进行比较。这将是实体属性值 (EAV) 设计模式的变体。这种模式通常被认为是危险的。查询是晦涩难懂的,因为一切都是“包”或“特征”;每个特定特征代表什么从来都不是显而易见的。编写查询以确保将限制的功能与交易中的相应功能进行比较可能是一项艰苦的工作。保养更是如此。性能往往会更差,因为这在引擎期望的工作方式之上添加了额外的抽象层。然而,它非常灵活。如果你做得恰到好处,添加另一个功能可以减少到简单的剪切和粘贴。
第三种选择是将每个值作为属性保存。这使得桌子非常宽。DBMS 将能够处理这个问题(在一定限度内!),但会使内容难以阅读。当存在多个可接受的值时,真正的问题就出现了。对于您的示例,限制中可能有两个可接受的指数,交易中可能有两个指数。您在每个限价表和交易表上创建了列index1
和。index2
为了检查有效性,必须比较所有可能的组合,即
(
limit.index1 = trade.index1
and limit.index2 = trade.index2
)
or
(
limit.index2 = trade.index1
and limit.index1 = trade.index2
)
Run Code Online (Sandbox Code Playgroud)
这很快就会变得丑陋。
我的建议是为每个实体实现一张表。编写查询并测试它们。它们可以逐步编写,首先检查国家/地区有效性,然后检查国家/地区和指数,然后检查国家/地区、指数和交易对手等。如果这种方法出现了特定问题,请暂停并根据新情况重新评估。