【问题标题】:Store values in separate, C# type-specific columns or all in one column?将值存储在单独的 C# 类型特定列中还是全部存储在一列中?
【发布时间】: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


【解决方案1】:

您可以将您的设置序列化为 JSON,然后将其存储为字符串。然后您将所有设置放在一行中,您的客户端可以根据需要反序列化。这也是一种无需修改数据库即可随时添加其他设置的安全方式。

【讨论】:

  • 我接受 Piotr Falkowski 的回答只是因为它是我要使用的答案。尽管我很想使用这个答案,但我无法 100% 地将其满足一些外围要求。不过,谢谢你!这绝对是我将来会记住的事情。
  • 感谢您的评论。祝您实施顺利。
【解决方案2】:

我们正在使用第二种解决方案,并且效果很好。请记住,磁盘访问量比 ex 大几个数量级。铸造操作(毫秒与纳秒,见ref),所以不要在这里寻找瓶颈。 解决方案可以是实现多态关联(12)。但我认为没有必要这样做,或者你应该这样做。第二种解决方案接近非 Sql db - 您可以将任何内容作为值转储,也可能是页面的整个 html 标记。知道如何处理数据应该是调用者的责任。

另外,请参阅有关如何在 DB 中存储设置的主题:123 以供批评。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-12
    • 2012-07-05
    • 1970-01-01
    • 1970-01-01
    • 2014-08-18
    • 1970-01-01
    • 2012-11-26
    • 1970-01-01
    相关资源
    最近更新 更多