我的应用程序将大量数据从数据库加载到一个复杂的数据结构中。内存中的数据结构重新封装数据库的结构,这意味着如果数据库包含以下表:
键的外键
然后我有A,B和C类,并且:
的指针
这意味着,如果加载数据库,就必须以正确的顺序加载它。如果我第一次加载C,那么它会抱怨它无法设置值C::m_b,因为它应该指向的实例没有加载。
问题是,当A中还有一个列是其他表的外键时,比如说C。
我可以通过将所有外键作为字符串加载来解决这个问题,然后在加载了所有数据之后执行查找,但是由于有时我必须加载数百万条记录,所以我无法在这些字符串(虽然是临时的)上花费内存。
读过关于好的设计(例如“大型C++软件设计”一书)之后,我觉得有循环引用是个坏主意。例如,如果文件X.H包含Y.H,但Y.H也包含X.H,则可能存在错误的设计;如果X类依赖于Y类,反之亦然,则可能存在错误的设计,应该通过提取该依赖项并引入依赖于X和Y的第三类Z来解决这个问题(X和Y不再依赖于彼此之间的相互依赖)。
把这个设计规则也扩展到数据库设计是个好主意吗?换句话说:防止外键中的循环引用。
发布于 2010-12-02 17:24:47
你必须对你拥有的数据进行建模。如果数据中存在循环关系(例如,每一张照片都属于一个文件夹;但是每个文件夹都有一张封面照片),那么将其建模为数据库中的循环关系是正确的。
在使用Oracle时,我只遇到过一次这种情况,所以我没有机会检查如何在其他数据库上实现这种关系。但对于Oracle,您可以在这里阅读我的文章:
http://www.databasesandlife.com/circular-dependencies-on-foreign-key-constraints-oracle/
https://stackoverflow.com/questions/3891535
复制相似问题