【发布时间】:2016-02-14 12:52:28
【问题描述】:
我正在构建一个 C# 项目配置系统,它将在 SQL Server 数据库中存储配置值。
我本来打算这样摆桌子的:
KeyId int
FieldName varchar
DataType varchar
StringValue varchar
IntValue int
DecimalValue decimal
...
值将与 DataType 列中的值一起存储和检索,以确定要使用的 Value 列,但我真的不喜欢这种设计。所以我想我会走这条路:
KeyId int
FieldName varchar
DataType varchar
Value varbinary
在这里,DataType 中的值仍将确定返回的 Value 的类型,但它们都在一个列中,我不必像以前那样编写大量重载来适应不同的类型解决方案。我只是将值作为字节数组拉入,并使用 DataType 执行任何必要的转换以获取我的值。
varbinary 方法是否会导致任何性能问题,或者将所有这些不同类型的数据放入 varbinary 中只是一种不好的做法?我已经搜索了大约一个小时,但我无法得到明确的答案。
另外,如果有任何人可以想到的更优选的方法来得出相同的结论,我会全力以赴。
【问题讨论】:
-
没有明确的答案。两种方式各有利弊。
-
这有点“内部平台效应”的味道(使用数据库表构建逻辑数据库表)。如果这是 just 配置名称/值对,我可能会始终使用字符串(对于您需要存储的任何真正的二进制数据,可能使用 base-64 或十六进制)。但是,如果这是您的实际数据:避免这种(反)模式 - 对于实际数据,您应该为每个值提供一个命名良好/类型化的常规列
-
@MarcGravell 你说得很好。这只是一个键/值对的情况,其中可以构造类似 Web.config 文件的内容,因此,例如,如果我们的数据库服务器名称之一发生更改,我们只需编辑使用该数据库的项目的配置值。因此,在您看来,将所有内容存储为 JSON 字符串(如下文所述的 ManOVision)是更好的解决方案吗?
-
@Tim 对于那种情况,我只使用带有 nvarchar 列名称和值(每个名称/值对的行)的表 - 如果您需要在 SQL 中编写脚本更改更容易(有趣的事实:这就是stackoverflow.com 的配置系统有效,加上一些“站点”、“数据中心”等可为空的列 - 用于每个站点的配置)
标签: c# sql-server