【问题标题】:Design Pattern to add columns in database table dynamically在数据库表中动态添加列的设计模式
【发布时间】:2014-05-16 04:43:47
【问题描述】:

用户希望在 UI 中动态添加新字段。这个新字段应该存储在数据库中,并且应该允许他们对其执行 CRUD。

现在我可以通过指定 XML 来做到这一点,但我想要一种更好的方法来搜索这些新列。此外,触发ALTER 语句并添加新列的想法似乎是错误的。

谁能帮我设计一个数据库服务器端的设计模式来解决这个问题?

【问题讨论】:

  • 为什么触发 ALTER 语句的想法似乎是错误的?
  • 什么关系型数据库? 究竟用户要求做什么? “添加字段”并不一定意味着您需要在数据库中创建新字段。

标签: sql database


【解决方案1】:

这可以使用键值系统来解决。您创建一个表,其中包含要注释的表的主键列、属性名称列和属性值列。当您的用户想要向人员 123 的记录添加一个属性(例如身高)时,您可以在新表中添加一行,其中包含值(123、'HEIGHT'、'140.5')。

通常,您将值转换为 TEXT 进行存储,但如果您知道所有属性都是数字的,您可以为值列选择不同的类型。您还可以(不推荐)根据数据类型使用多个不同的值列。

这种技术的优点是您不需要修改数据库结构来添加新属性,并且属性只存储在那些具有它们的记录中。缺点是查询不像列都在主数据表中那么简单。

【讨论】:

  • 我认为这似乎是迄今为止我见过的最好的方法。非常感谢。我会试试这个。
  • 祝你好运。我的建议不是唯一的解决方案,也不是完美的,但它具有灵活性并避免了您正确识别为问题的问题——让用户修改数据库结构。
  • 它这么好,但我们怎么能搜索一个人。例如身高=140.5、体重=56的人是谁?
  • @saeed:有几种方法。您可以将属性表连接到 person 表两次(一次用于高度属性,一次用于重量属性),您可以使用几个 WHERE EXISTS 子句,您可以在 WHERE 子句中执行几个单例 SELECT,等等。
  • 例如,Magento 电子商务软件的数据库使用这种带有三个重要表的实体-属性-值 (EAV) 模型:一个定义列名,一个用于 VARCHAR 值,以及一个用于INTEGER 值。
【解决方案2】:

没有理由不允许合格的业务用户向表中添加列。与您可以想象的任何其他事情(包括向表中添加新行或更改)相比,它不太可能导致问题。数据元素的值。

使用上述任何一种方法都不能避免任何风险;它们只是对 COBOL 填充字段或数据库功能的不必要修饰的回归。结果仍然可能是非规范化和不准确的。

这些业务人员在电子表格中添加列,在 Word 文档中添加表格,而 DBA 不会妨碍他们。

当然,仅添加列是使信息系统正常工作的最小部分,但通常情况下,它被认为是几乎无法克服的障碍。假设你知道把它放在哪里,实际上是 5 分钟的工作。将具有正确数据类型的列添加到正确的表中很容易,易于使用,并且最有可能提高数据质量。

【讨论】:

    【解决方案3】:

    找出用户添加字段的最大数量并预先添加它们。例如“用户 1”、“用户 2”、“用户 3”、“用户 4”...等。然后,您可以根据一些可配置的设置启用 UI 上的字段。

    【讨论】:

      猜你喜欢
      • 2013-07-24
      • 2013-06-10
      • 1970-01-01
      • 2018-12-24
      • 2022-10-15
      • 1970-01-01
      • 2023-03-12
      • 2022-07-21
      • 2012-08-21
      相关资源
      最近更新 更多