我的数据库中有一个表,该表代表自定义表单的数据字段。数据场给出了应该表示什么样的控制以及应采用的值类型的一定表示。简化了您可以说我在此表中有2个实体 - 文本框,仅处理数字的任何字符串和文本框。

现在,我将不同的值存储在单独的表中,引用了数据字段定义。当类型不同时,在此处存储数据值的最佳方法是什么?

一种可能的解决方案是让fieldValue表每种可能的值类型保持一个字段。现在,这肯定会是多余的,但是至少我会以正确的形式存储该值 - 以后简化查询。

FieldValue
----------
Id
DataFieldId
IntValue
DoubleValue
BoolValue
DataValue
..

另一种可能性是将所有内容存储为字符串,然后将其施放在查询中。我正在使用.NET与Nhibernate一起使用,并且我看到至少这里有一个投影。广播可用于将EG字符串施加到int中。

无论哪种方式,我都需要知道进行查询时要使用哪种类型,但是我会从数据域中知道这一点,因此这不会是问题。

反正;我认为这些解决方案听起来不好。他们是吗?或者,还有更好的方法?

有帮助吗?

解决方案

没有第三个“魔术”选项:您的具体情况决定了您要如何进行。

根据我的经验,仅使用弦乐的解决方案对应用程序设置之类的东西很有意义。通常,我不需要直接在查询中使用此类数据,因此它以字符串形式不大。

我不确定,但是似乎您正在扩展具有自定义属性的实体,这听起来您可能想在某个时候在数据库中进行一些处理。在这种情况下,您不妨采用多列方法,并仅填写正确的列。它不会很漂亮,但可能会简化查询。

正如我所说,这取决于您是否需要运行什么样的查询,需要什么样的性能等。

其他提示

从多租户数据存储中提取想法,您可以使用 MSDN上所述的“名称对”的价值观想法. 。我以某种方式认为,除了指出的特定部分外,本文将更有用。

实际上,为了使其成为可扩展的解决方案,您需要使用元数据表定义自定义表单的数据类型。您也可以考虑存储.NET类型,因为在输入验证等方面可能会为您提供帮助。您的自定义表格。使用这种方法,您可以根据存储的元数据构建自定义表格。

我已经成功地使用了这种方法,并且效果很好。另外,我们还使用元数据表来定义自定义字段的预期价值是提供用户(例如名称,出生日期)还是下拉列表中的预定义系统值(例如,Citye列表,国家 /地区, )。为了支持这一点,我们还有一个附加表,其中包含列表的选项,该选项链接回元数据表。

如果您只有2个文本框,用户可以输入值,并且它将是字符串或数字,那么您真的需要能够区分int和double,您是否只是将其全部存储为一个合适的数字类型(取决于DB)。这将使您只能达到2种不同类型,然后可能的解决方案是拥有2个表,其中一个是两种类型的表。

不过,总的来说,每当我发现很难知道什么数据类型时,我就会开始担心该项目正在尝试成为通用的,这很倾向于变得非常混乱。

在提供我的观点之前。我想说您可能需要回到急诊室。我想一个 定制物 有很多 字段 这些 字段 是不同的(文本,数据,甚至行为和样式),而不是概括概念 场地 相反,可能值得考虑为每种类型的字段创建一个表。例如,datefield,用户名等。这将使值类型正是具有正确类型的一个非零列。我也敢打赌,这将简化您的代码(更少的检查条件,数据库为您提供了所有信息。)

也就是说,您可能无法返回急诊室,或者可能存在以每种方式进行多列方法的基本有效理由。这是这种方法的一些利弊。

优点

  • 一张桌子, 可能 事实证明更快(尽管请记住所有邪恶的根源是..)

缺点

  • 数据库不能强制执行指定不超过一个值(要检查异常的额外代码)
  • 数据库无法强制执行至少一个不是零(额外的代码,要检查没有任何值的fieldValues)
  • 添加支持新数据类型的支持需要更改所有现有数据(在列上添加零值)。

如果您被困在 定制物 > 场地->现场价值 我建议创建一个表 现场价值. 。例如

IntFieldValue
-------------
Id
DataFieldId
Value

DecimalFieldValue
-------------
Id
DataFieldId
Decimal


DateFieldValue
-------------
Id
DataFieldId
Date

使用以上内容,您仍然可以创建一个从上表中选择的视图。可以创建该视图以提供每个值类型和 保证 其中只有一个人不是零。这也更容易扩展(添加新表,更改视图,但不需要更新具有新类型列的空值的任何现有数据)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top