2013-12-19 37 views
3

我已经在我的MySQL最近刷牙了,我需要做一个数据库,分层数据。具有多种数据类型的闭包表?

我需要在一个树格式表示几种不同类型的数据,但不知道如何去这样做。

例如,比方说,我有一个人,谁可以使用,或者被其他人使用。每个人都可以有设备检查了他们,并且每一台设备必须有一个名称,描述和更换部件的列表,每个替换部件必须有一个成本,等等,等等

大多数示例关闭表我看到关注他们处理论坛或线程注释的真棒。我如何去做一个有多种数据类型的闭包表?

+0

为什么封闭表多种数据类型?我认为闭包表将引用/指针/外键保存到节点表中。闭包表不会有任何节点(人表)的数据类型的列 - 就像“指针”列的int或char(36)一样? – AgRizzo

回答

1

这里有一个快速和肮脏的例子:

select * from person 

| pID | name  | employedBy | 
+-----+-----------+------------+ 
| 1 | John Doe |   2 | 
| 2 | Joe Smith |  NULL | 
| 3 | Meg Ryan |   3 | 

select * from equipment 

| eqID | eqName | eqDescription  | eqOwner | eqCheckedOutTo | 
+------+----------+-------------------+---------+----------------+ 
| 1 | stuff | just some stuff |  3 |   NULL | 
| 2 | table | a table   |  1 |   NULL | 
| 3 | computer | PC computer  |  3 |    2 | 
| 4 | 3table | table with 3 legs |  2 |   NULL | 

select * from parts; 

| partID | partName  | partCost | 
+--------+--------------+----------+ 
|  1 | desktop1  | 499.99 | 
|  2 | monitor13x13 | 109.95 | 
|  3 | windows95 | 10.00 | 
|  4 | speakers  | 30.00 | 
|  5 | tabletop  | 189.99 | 
|  6 | table leg | 59.99 | 

select * from equipmentParts 

| epID | eqID | partID | quantity | 
+------+------+--------+----------+ 
| 1 | 3 |  1 |  1 | 
| 2 | 3 |  2 |  2 | 
| 3 | 3 |  3 |  1 | 
| 4 | 2 |  5 |  1 | 
| 5 | 2 |  6 |  4 | 
| 6 | 4 |  5 |  1 | 
| 7 | 4 |  6 |  3 | 

它们可以查询,如:

select name,eqName,e.eqID,partName,partCost,quantity,(quantity*partCost) AS totCost 
from person p 
inner join equipment e ON e.eqOwner=p.pID 
inner join equipmentParts ep ON ep.eqID=e.eqID 
inner join parts pa ON ep.partID=pa.partID 

| name  | eqName | eqID | partName  | partCost | quantity | totCost | 
+-----------+----------+------+--------------+----------+----------+---------+ 
| John Doe | table | 2 | tabletop  | 189.99 |  1 | 189.99 | 
| John Doe | table | 2 | table leg | 59.99 |  4 | 239.96 | 
| Meg Ryan | computer | 3 | desktop1  | 499.99 |  1 | 499.99 | 
| Meg Ryan | computer | 3 | monitor13x13 | 109.95 |  2 | 219.90 | 
| Meg Ryan | computer | 3 | windows95 | 10.00 |  1 | 10.00 | 
| Joe Smith | 3table | 4 | tabletop  | 189.99 |  1 | 189.99 | 
| Joe Smith | 3table | 4 | table leg | 59.99 |  3 | 179.97 | 

或总结每个设备的成本:

select name,eqName,sum(quantity*partCost) AS totCost 
from person p 
inner join equipment e ON e.eqOwner=p.pID 
inner join equipmentParts ep ON ep.eqID=e.eqID 
inner join parts pa ON ep.partID=pa.partID 
group by e.eqID 

| name  | eqName | totCost | 
+-----------+----------+---------+ 
| John Doe | table | 429.95 | 
| Meg Ryan | computer | 729.89 | 
| Joe Smith | 3table | 369.96 | 
相关问题