我正在开发一个以SQL数据库作为后备存储的程序。作为一个非常广泛的描述,程序本身允许用户在任意数量的用户定义的表中生成记录并在它们之间建立连接。至于规格:
连接是这个程序的一点,所以很有可能连接的数量很高,特别是当用户按预期使用软件的时候。在设计时,用户表、连接或记录都不是用户生成的。
我花了很多时间试图找出如何设计备份存储和对象模型,以最适合这些规格。在我的第一次设计尝试中,我有一个对象管理一个表的所有记录和连接。我之所以尝试这样做,首先是因为它使内存占用更小(记录和连接是简单的dicts),但是维护表became....onerous之间的聚合和链接信息(即.一个巨大的意大利面混乱)。使用此方法跟踪依赖关系几乎变得不可能。相反,我已经确定了一个分布式智能图,通过管理它自己的数据和与其他记录的连接,每个记录和连接都“知道”它周围的是什么。这样做增加了我的内存占用,但也允许我创建一个故障系统,以便连接/记录在需要之前不会加载到内存中。编写代码也容易得多:跟踪依赖关系、消除循环递归更新等等。我最大的问题是存储/加载连接。我对我目前的任何解决方案/想法都不满意,所以我想问一问是否还有其他人对如何构建这个问题有任何想法。连接相当简单。它们包含: fromRecordID,fromTableID,fromRecordOrder,toRecordID,toTableID,toRecordOrder。到目前为止,我想出的是:
有没有人想出更好的方法来做这件事?一旦我致力于一个特定的设计模式,我就会坚持它,所以我想确定我已经想出了最好的设计模式。
我还将注意到,我目前的备份存储是SQLite。不过,我编写该程序的目的是不依赖于特定的后备存储,方法是引入适配器层,将数据检索与程序的其余部分分离开来。所以备份存储可以是任何东西,甚至是一个简单的文本文件。我只使用后备存储存储和数据检索,没有其他。我不使用任何特定的数据库/SQL关系特性,也不使用数据库执行计算(聚合或其他)。所有这些都是在程序逻辑中处理的。
发布于 2012-07-02 19:00:50
除了#8之外,您的所有需求都是由关系数据库实现的(考虑一下INFORMATION_SCHEMA,这是一种标准的关系数据库特性--信息模式包含描述数据库中的表、它们拥有哪些列等的视图),您的应用程序将很好地处理INFORMATION_SCHEMA数据)。
多亏了#8,您基本上已经将自己逼到编写自己的关系数据库引擎上了。
听起来你在实施访问.实现它自己的关系数据库(Jet);它也很糟糕,因为实现关系引擎相当困难(如果您受Access所具有的约束的话,则更多),而且最终,访问并不能使困难的事情变得简单。
当然,在另一个数据存储之上实现关系数据库引擎可能会简化事情(例如,Berkeley DB对于实现RDBMS很有用,而且Berkeley DB无处不在。(参见我最近给出的一个相关的答案),但我会仔细考虑需求#8和项目的可行性。
https://softwareengineering.stackexchange.com/questions/155023
复制相似问题