【问题标题】:Need a good way to store data in a DB from a table on a webpage that can have N columns需要一种将网页上的表中的数据存储在数据库中的好方法,该表可以有 N 列
【发布时间】:2010-03-16 19:32:49
【问题描述】:

用户需要能够将特定类型的列添加到我网页上的其他静态表中,然后将他们在其中输入的信息保存到数据库中。

有人告诉我,实际上它们几乎不会超过 5 列,但我宁愿支持 N。这些列都将具有相同的数据类型。

我的第一个想法是创建一个 XML 列,其中包含所有添加列的值,但我很好奇是否有人提出了更好的解决方案。有什么建议吗?

【问题讨论】:

  • 他们需要以这种方式动态添加列的具体操作是什么?通常,这被认为是一种非常糟糕的做法。数据库设计不应留给用户。

标签: sql-server-2008 database-design


【解决方案1】:

如果你把这些数据序列化成一列(比如使用xml),如果你需要在上面搜索就会有问题。

如果您不需要搜索它,那么 xml 就可以了。

你可以使用父子模型:

FixedTable
PK
data1
data2
...

VariableTable
PK - auto generate/identity
fk - points to FixedTable.PK
data1

并且仍然可以添加索引和搜索。您的常规数据进入 FixedTable,用户添加的任何 extra columns 进入 VariableTable。

【讨论】:

  • 什么样的问题?表现?我认为您可以在我正在使用的 SQL Server 2008 的 where 子句中检查 XML 值。
  • 是的,在 2008 年您可以:stackoverflow.com/questions/966441/xml-query-in-sql-server-2008,您应该使用正确的 sql-server-2008 标签编辑您的问题!
  • @Abe:@KM 正在讨论存储为序列化字符串值的 XML VS 之间的区别。 XML 存储为 XML 数据类型。
  • 它将是 XML 数据类型。已添加标签。
【解决方案2】:

您可以使用vertical table。有一些你必须跳过的障碍,你会受到一些性能影响,但它们在这方面非常灵活。此外,如果您使用的是 SQL Server,请查看PIVOT command

【讨论】:

    【解决方案3】:

    如果您必须这样做,请在一个单独的表中执行此操作,以便稍后加入原始表。如果必须,您可以使用 EAV 结构,但请注意添加 n 列的灵活性会对性能造成很大影响。我说的是在许多情况下的性能确实令人无法接受,而且记录越多,它变得越糟。除非你确定你别无选择,否则不要走这条路。

    另一种方法是听从他们的话,并添加一个包含五列标记为 col1、col2、col3 的表(以及您需要链接到用户和/或其他数据表的任何其他列),然后让他们将数据添加到那些列。如果每个用户要给他们命名不同的名字,你可能需要一个交叉引用表来确定列名。

    您可以将数据放入一个 xml 字段中,但是稍后您将如何查询呢?在决定处理方式之前,您确实需要弄清楚这一点。

    一般来说,这种级别的灵活性是一个糟糕的主意。五个不同的用户将分别添加五个不同的列,这些列包含您想要一起查询的类似数据,但是因为他们每个人都使用不同的名称,所以您将一团糟而不是数据库。如果您必须有客户设计的列,请尝试至少让每个客户有一个管理员来添加列,而不是让用户在他们认为不错的情况下即时添加。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-14
      相关资源
      最近更新 更多