如何处理有两个父选项的孩子

时间:2013-03-25 18:26:38

标签: sql sql-server

我们正在创建一个活动构建器,我正在努力处理一个不同类型的父母一个孩子的好方法。

我们有两个表类别和活动。 类别具有ID和名称 活动有一个id和parentid

parentid活动可以是类别的id,也可以是其他活动的id。 类别具有活动,每个活动可以具有子活动。 类别仅为顶级,因此没有类别或活动具有子类别

现在我有两个问题 设置表的最佳方法是什么。 我曾考虑将它们存储在单独的列中,与具有id和某种标志的字符串相同的列,具有id的列和具有父表的另一列。

我认为这些都不是很好,并且想知道是什么。

另一个问题是我如何拉这个表。我知道我可以进行多次查看,但是如果有办法在一个方法中进行操作就会徘徊。

我们正在使用MSSQL 2012

编辑

以尝试澄清和添加更多信息

1 个答案:

答案 0 :(得分:0)

我不是SQL中“重载”的忠实粉丝。换句话说,列应包含仅表示一件事的数据。因此,我建议采用以下数据结构。

类别=> Id |名称

活动=> Id |名称| CategoryId不为null | ParentActivityId null

这样,每个活动都与一个类别相关联,并且可能与父活动相关联。

就“拉”而言?我猜你的意思是选择数据?

SELECT a.Name AS ActivityName, c.Name AS ParentName, c.Id AS ParentId
FROM Category c
JOIN Activity a
ON c.Id = a.CategoryId
WHERE a.ParentActivityId IS NULL

UNION 

SELECT a.Name AS ActivityName, c.Name AS ParentName, c.Id AS ParentId
FROM Activity c
JOIN Activity a
ON c.Id = a.ParentActivityId