c# - 寻找一种存储父子孙结构的方法

标签 c# sql sql-server sql-server-2008

我需要存储一个结构,其中 N 个 parent 将有 1 到 N 个 child ,每个 child 将有 1 到 N 个 child 。我想以一种相对高效且高度可扩展的方式将其存储在数据库中,而无需更改数据库架构。

每个 parent 都必须是唯一的,N 个 parent 可能有同一个 child 。但是,根据 parent 的不同,该 child 可能有不同的 child 。 (一清二楚?)

将此描述为 parentA 可能有一个具有某些属性(棕色头发、棕色眼睛)的男孩可能更容易。 parentb 也有一个男孩,但这个 child 是金发蓝眼。我需要以标准化的方式存储每个 child (男性和女性)和每个属性(头发和眼睛的颜色),并以这样一种方式将它们关联起来,即当我查询 parenta 时,我会得到他们所有的 child 和那些 child 的属性。

我已经对 SQL 中的树结构和层次结构做了一些处理,但是我很难以一种满足我的性能和可扩展性要求的方式来概念化这个特定场景。子项和相关属性将定期(如果不频繁)添加。 提前致谢。我知道需要澄清。

补充说明

好的,看来可能需要一个不同的例子。让我们使用汽车这个古老的例子。

CarA 和 CarB 都有方向盘、引擎和轮胎。 CarA 的方向盘上有 radio 控制装置。 CarB 的方向盘没有。 CarA 有一个六缸发动机,CarB 有一个八缸发动机。我需要用该特征的属性对每辆车和每个特征之间的关系进行建模。我真的在帮忙吗? -rb

最佳答案

如果这固定在三层并且它们在概念上是不同的(如在您的扩展示例中),那么我认为您对不需要树的概念感到困惑。只需像处理任何其他问题一样使用表和关系。

  • parent table
  • 一个 child 的表(如果他们总是恰好有两个 parent , parent 可以是字段,否则你还需要一个关系表)
  • 一个表用于属性,另一个表用于属性与子项之间的多对多关系[或将这些存储在子表中 - 请参阅下面 DForck42 的评论]

在不同层次的节点是“同一事物”的地方,树是必要的。但它们不太适合 sql,所以我不会尝试在似乎不需要它们的地方使用它们。


更新。从您下面的评论来看,我认为您是在说 child 分为类(class)或类型,并且可能的属性取决于 child 的类型 ,但这些属性的值取决于父项。

在那种情况下,您会遇到一个完全不同的问题,更像是 OO 继承。我看到的最简单的解决方案是您可以为每种 child 准备一张不同的 table 。那么每个表对于不同的属性都有不同的列。子表引用父表。

因此您将拥有一个带有 ID 的父表。那么您可能有一个“管理站点”的子表。该子表的每一行都将通过 ID 引用父表,并包含 URL、CSS 等作为列。另一个子类型,如“数据库配置页面”,将在另一个表中,具有不同的属性集。

如果你有共同的属性,那么你可以在每个表中重复它们,或者有一个“父类(super class)”表。

像这样的解决方案可能会变得非常复杂,我建议您在对所需内容有更清晰的解释后再问一个问题。这里有对选项的很好解释 - http://www.sqlalchemy.org/docs/orm/inheritance.html (忽略与 SQLAlchemy 相关的部分,只看它们如何以不同的方式使用表来建模继承)。

关于c# - 寻找一种存储父子孙结构的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7194638/

相关文章:

c# - 区分抛出的 SqlException

c# - Windows 通用应用程序中的加速度计摇动事件不起作用

SQL Server 2008-获取表约束

python - 使用 python 通过 SQLAlchemy 引擎将 panda 数据框更新到 SQL Server

sql-server - SQL Server 中的报表生成器和 VS 中的 Reporting Services 之间的区别

c# - 以编程方式设置文本区域不起作用 C#

c# - 测量弦高

sql - 如何填写缺失的日期

asp.net - 您使用什么工具来提高编码效率和整体效率

sql-server - 意外的查询结果