关系数据库中不同对象的图(实现类似的接口)

时间:2012-06-04 11:27:46

标签: mysql database postgresql relational-database

所以我在思考涉及将对象序列化到关系数据库的某些问题。

假设您有N个不同的对象,都实现了某个特定的接口(有关图形界面。它们提供getIncomingNodes(),getOutgoingNodes()等方法。)

如果每个此类对象在关系数据库中都有对应的表, 将这样的有向图序列化到关系数据库的最佳实践是什么?

假设N很小,(在我的情况下,N = 3)我将所有可能的链接分解为包含在单独的表中。 例如,从对象x指向y的链接表将类似于:

tbl_links_X_Y {
int X_id
int Y_id
}

问题是,你得到N ^ 2这样的表 - 效率不高,并且可能难以在将来扩展到N + 1个对象。

有没有解决这个问题的模式? (即使它不涉及关系数据库,我也很乐意听到......)

谢谢!Ø

3 个答案:

答案 0 :(得分:0)

您也可以轻松地将对象类(表名)存储在连接表中。

tbl_links_X_Y {
int X_id
int Y_id
enum {user, customer, product} X_type
enum {user, customer, product} Y_type
}

他们只需将其包含在where或join子句中。

我想这不是一个严格的关系数据库,因为你不能(?)使用/强制执行外键约束。

答案 1 :(得分:0)

你也可以“强制”你的图表遵循关系模型:即

表格图{ 整数vertexid, varchar edgelist }

edgelist可以是一个基于分隔符的字符串:例如{2,10},{3,12},{4,13}等,其中条目是{事件顶点,重量}
这样,表中的行数将是O(n)而不是O(n ^ 2)

然后,当您的应用程序读取图形并执行某些操作时,您必须在内存中构建图形,并执行相同的操作。

答案 2 :(得分:0)

所以最近我遇到了NoSQL框架调用OrientDB。该数据库引擎完全处理了这个问题。 它是graph database,能够执行另一个对象指向的SQL查询和延迟加载对象(如相邻顶点)。

剩下的一件事是将此框架的性能与传统SQL数据库的性能进行比较。 (当然,我必须考虑在传统SQL数据库中从原始响应构造对象所需的时间。)

一旦我得到这个比较的结果,我会在这里发布它们。