3

我有一个表,它的一些列在编译时是未知的。这样的列可以是整数值,也可以是某个 Enum 值。有一个表保存了这些动态列的所有名称,还保存了列的类型。此“元表”具有以下列:

  • 动态列 ID (Pk)
  • 姓名
  • TypeId(整数/枚举,作为来自单独表的 Fk)

整数列具有该表的Name,而 Enum 列是具有该Name的表中的 Fk 列,并进行了一些修改(例如,“DynamicTable”前缀)。

对于这种情况,我能想到的唯一解决方案是使用 Reflection.Emit 动态创建实体类和相应的映射类。诚然,我是 Nhybernate / Fluent Nhybernate 的新手,表之间的层次结构似乎相对简单,所以我想验证我的解决方案并不像最初看起来那样难看......

我也欢迎完全无视我的表层次结构的解决方案,以便有效地获得相同的结果(即,枚举动态表上的行,遍历所有列,了解它们是否为枚举,如果它们是,它们的可能值也是)。

编辑:关于问题域的附加信息)我最初包含了最少的细节,以避免与 Too-Much-Info 相关的混淆。这种描述要复杂得多,但它揭示了这种设计背后的动机。

所涉及的应用程序旨在自动化日志/转储分析。分析场景经常由日志/转储专家提供,因此,为了简化需求=>实施=>验证周期的典型流程,此类分析场景由专家直接实现为 Iron Python 代码片段,具有一些特定领域的结构注入到片段的范围内。每个片段都有一个与之相关的“上下文”。“上下文”的示例可以是“产品”、“版本”等......因此,片段本身仅在某些上下文中调用 - 这有助于通过消除分支来简化 Python 代码(您可以将其视为面向方面的编程, 在某种程度上)。非专家可以使用具有给定代码上下文数据库的应用程序,在为各种上下文选择值之后分析日志/转储。当专家决定对某个代码片段进行编目需要新的上下文时,他可以添加一个上下文,指示它可能具有的值。将新上下文添加到数据库后,运行分析的非专家将可以选择为新添加的上下文选择值。“动态表”是将代码片段与发出片段时存在的各种上下文(列)的值以及当时不存在的列的默认值相关联的表。将新上下文添加到数据库后,运行分析的非专家将可以选择为新添加的上下文选择值。“动态表”是将代码片段与发出片段时存在的各种上下文(列)的值以及当时不存在的列的默认值相关联的表。将新上下文添加到数据库后,运行分析的非专家将可以选择为新添加的上下文选择值。“动态表”是将代码片段与发出片段时存在的各种上下文(列)的值以及当时不存在的列的默认值相关联的表。

4

1 回答 1

0

我不会声称完全理解您的场景,但在我看来,您最好使用Redis之类的键值存储或CouchDB之类的无模式数据库而不是 SQL。对于关系数据库来说,这似乎不是问题,但如果你真的需要使用 RDBMS,我会尽可能地将 NHibernate 映射到真实模式(DynamicColumnId、Name、TypeId),然后构建你需要的任何数据结构最重要的是。

于 2010-03-16T01:59:48.683 回答