当关系取决于值时,如何在几个表之间建立关系

时间:2018-02-26 08:01:32

标签: c# sql

我hava表处理“树”结构

Id Auto   - increment int (key column)
LevelType  -Int (tell where I get detailt data depend my selection
LevelParentId -Int (if node have parent node)
LevelChildId -Int (if node have child node)
DataId  -int (tell what is index for detail data)

然后我有表格,我获取LevelType id列的值。 现在,如果用户添加树节点,他将为节点命名并指定节点类型。现在我想根据LevelType显示来自其他表的数据。示例如果LevelType值为1,则详细数据在表“Comppany中。 如果LevelType值为2,则详细数据位于表“Department”

我可以使子查询处理LevelType的选择,但我如何指定哪个表获取详细数据...... ??

Database diagram

感谢您的回答。我决定使用Datset instanse

1 个答案:

答案 0 :(得分:1)

我猜你正在使树的存储结构变得复杂。请考虑以下方法:

表:节点

  • Id Auto Increment(整数PKey) - 表示每个的唯一NodeId 节点
  • string NodeData - 表示您要保留的数据
  • ParentId(Integer nullable) - 表示父节点的Id。空的 根节点。

更新

尝试以下列方式使用SQL CASE:

CASE 
WHEN LevelTypeId = 1 THEN (SELECT FROM Company Table)
WHEN LevelTypeId = 2 THEN (SELECT FROM Department Table)
END

但是,请记住,案例必须为sql选择相同类型的数据。

更新2:

"当关系取决于值"

时,如何在多个表之间建立关系

您的意思是如何在Tree表和Company / Department表之间建立外键关系,因为关系取决于LevelType列的值是1/2 ??

实现此目的的一种方法是在您的数据访问层C#代码中处理此关系。否则,以这样的方式重构数据库:只有一个内容表(即公司/部门都将存储在相同的表中)。将公共属性保留为列,而将特定列保留为XML列。序列化Company / Department对象以存储到XML列中。