2012-03-07 39 views
1

我想使用MySQL和SQLAlchemy(0.7)在SQL表中使用多个链接列表。所有带有父节点的第一个节点的列表都是0,结束于子节点为0.该id代表列表,而不是indevidiual元素。该单元由PK使用SQLAlchemy和MySQL的多个链接列表

认定有了一些省略语法(的问题不相关),它应该是这个样子:

id(INT, PK) 
content (TEXT) 
parent(INT, FK(id), PK) 
child(INT, FK(id), PK) 

如表有多个链接列表如何可以返回从整个列表数据库我选择一个特定的ID和父母是0?

例如:

SELECT * FROM ... WHERE id = 3 AND parent = 0 
+0

我不明白。 'id'是一个特定链表或者一个特定元素的唯一标识符吗?你想提取什么:列表中的所有元素?或者列表中的所有元素以正确的顺序_? – jogojapan 2012-03-07 10:58:38

+0

这个元素是独一无二的,我会更新这个问题来反映这一点。 – Chrizmo 2012-03-07 11:00:17

+0

在retrospecr;这是一个坏主意,所以身份证明了整个名单。 – Chrizmo 2012-03-07 11:07:09

回答

0

既然你有存储在同一个表的多个链接列表,我假设你存储无论是头部和/或那些在某些其他表的尾部。一些想法:

1)保持链表:从数据查询的角度 第一个大的改善(在评论中还提出),将有一些共同的标记(让称它为ListID)的所有节点在同一个列表中。这里有几个选项:

  • 如果每个列表从一个对象(数据行)只引用[我甚至短语,如“是否列表属于单个对象的问题?],然后这个ListID可以简单地作为持有者对象的(主要)标识符,其顶部为ForeignKey以确保数据的完整性 在这种情况下,查询所有列表非常简单,事实上,您可以定义relationship并像my_object.my_list_items一样导航它。
  • 如果列表被多个对象使用/引用,那么可以创建另一个R表将只包含一列ListID (PK),每个节点/项目将再次有一个ForeignKey到它,或类似
  • 别的东西,大的列表可在两个查询/ SQL语句被载入:
    1. 查询头/尾由其ID
    2. 查询基于整个列表接收到的HEAD的ListID/TAIL
      事实上,这可以用诸如下面的一个一个查询(单查询示例),这是比较来进行从IO角度来看是有效的,但是分两步做就有一个好处,那就是您立即引用了HEAD(或TAIL)节点。

单查询例如:

# single-query using join (not tested) 
Head = alias(Node) 
qry = session.query(Node).join(Head, Node.ListID == Head.ListID).filter(Head.ID == head_node_id) 

IIN任何情况下,为了遍历链表,你必须通过它的ID来获得头/尾,然后遍历照常。
注意:在这里,我不确定SA是否会认识到引用对象已经加载到会话中,或者将为其中的每一个发出其他SQL语句,这将破坏批量加载的目的。


2)Ordering List扩展替换链表:
请阅读Ordering List文档。这很可能是Ordering List的实现将足够让你使用,而不是链接列表

+0

感谢您的反馈,在我的交谈之后@jogojapan早些时候我改变了每个列表元素的标识。说到HEADS和TAILS,这是0,它是不可变的,并在同一张表中。列表标识的方式就像你如何使用包含我称之为meta的信息的单独表格。似乎我们有类似的想法。 – Chrizmo 2012-03-09 09:18:49

+0

@Chrizmo:你在PK = 0的表中有一排吗?或者你不强制实施ForeignKey约束? – van 2012-03-09 09:27:37

+0

我强制ForeignKey约束,我有PK = 0。 – Chrizmo 2012-03-09 10:13:02