如何设计满足以下要求的表格?

时间:2009-12-22 10:29:53

标签: mysql

我有以下要求。

父子映射表

  

ID ParentID ChildID

     

1 1 2

     

2 1 3

     

3 2 4

     

3 2 5

     

3 4 6

主表

ID  ViewCount

1   3  
2   4    
3   4 
4   5   
5   6

父和子在同一个表中,并有自己的视图。

当我读取任何记录时,它必须获取特定记录的viewcount以及他们孩子的观看次数。

我只更新了特定的记录viewcount,没有更新他们的父母。

因此,从主表中,当我访问ID为1的记录时,它必须获取所有子视图和自己的viewcount。对于这种情况22。

当我访问2时,viewcount为15.没有等级,它会根据孩子的增长而增长。

如何编写查询或重新设计表格或任何内容

实施上述要求?

主表中的ID列同时引用父ID和子ID以及主键。在映射表中,我们映射父和&孩子的关系。父/子表中存在的ID是表的主键字段。没有使用该字段

2 个答案:

答案 0 :(得分:4)

您拥有的结构(父/子)称为邻接列表。获取一个节点及其所有子节点(例如将它们的ViewCount相加需要递归。不要屏住呼吸等待MySQL实现它:http://bugs.mysql.com/bug.php?id=16244。实现SQL标准特性CTE大多数主要SQL数据库(PostgreSQL,DB2,MS SQL Server,可能是最近的Oracle)的语法几乎相同; Oracle有一个CONNECT BY / PRIOR。

还有其他树的编码可以在没有递归的情况下查询,但它们比邻接列表稍微复杂一些。谷歌“sql嵌套间隔”,或阅读Vadim Tropashko的书

哦,顺便说一句,你父/子表中的合成id列是一个糟糕的设计,因为它允许你有重复的数据。删除它,并在真正属于那里的两列上创建主键。

答案 1 :(得分:0)

在您的程序中,您是否有任何表示父项和子项的对象?如果是这样,您可以在程序中进行递归以获取项ID的列表,那么您可以执行以下操作。

SELECT sum(ViewCount)FROM MainTable WHERE id in( program from program