【问题标题】:Implementing custom fields with ALTER TABLE使用 ALTER TABLE 实现自定义字段
【发布时间】:2010-02-05 13:03:57
【问题描述】:

我们目前正在考虑为我们的网络应用程序实现自定义字段的不同方法。用户应该能够为某些实体定义自定义字段并填写/查看此数据(并可能稍后查询数据)。

我了解实现自定义字段有不同的方法(例如,使用名称/值表或使用更改表等),我们目前倾向于使用 ALTER TABLE 将新的用户字段动态添加到数据库中。

在浏览了其他相关的 SO 主题后,我找不到这个解决方案的任何大缺点。相比之下,可以选择快速查询数据(例如直接使用 SQL 的 where 语句)对我们来说是一个很大的优势。

以这种方式实现自定义字段有什么缺点吗?我们谈论的是一个最多可供 100 个用户同时使用的 Web 应用程序(不是并发请求..),并且可以同时使用 MySQL 和 MS SQL Server 数据库。

【问题讨论】:

  • 您如何知道哪些自定义字段与每个用户相关联?
  • 您将如何以任何有意义的方式索引这些用户创建的列?
  • 实现一个“数据字典”表是很简单的,用户可以在其中输入他们的要求:表 x 上的一个新字段,名称 y,数据库 z。这样您就可以找出用户的自定义字段并将其显示给该用户而不是其他人。

标签: mysql sql-server database custom-fields


【解决方案1】:

作为更新,我们决定通过 ALTER TABLE 向现有数据库表添加新列以实现自定义字段。经过一些研究和测试,这看起来是大多数数据库引擎的最佳解决方案。包含自定义字段元信息的单独表格提供了管理、查询和使用自定义字段所需的信息。

【讨论】:

    【解决方案2】:

    我看到的第一个缺点是您需要为您的应用程序服务授予 ALTER 权限。
    这意味着您的安全模型需要特别注意,因为应用程序不仅可以添加字段,还可以删除和重命名它们并创建一些表(至少对于 MySQL)。

    其次,您如何区分每个用户所需的字段?或者用户A创建的字段可以被用户B访问吗?

    请注意,列的基数也可能会显着增长。如果每个用户添加 2 个字段,我们已经在谈论 200 个字段。

    就个人而言,我会使用两种方法中的一种或混合使用:

    1. 使用序列化字段

    我会在表中添加一个文本字段,我将在其中存储一个或多个序列化字典:

    { 
      user_1: {key1: val1, key2, val2,...}, 
      user_2: {key1: val1, key2, val2,...}, 
      ...
    }
    

    缺点是值不易搜索。

    1. 使用多类型名称/值表

    字段表:

    user_id: 整数
    字段名称:varchar(100)
    类型:枚举('INT','REAL','STRING')

    值表:

    field_id: int
    row_id: int # 主表行id
    整数值:整数
    浮动值:浮动
    text_value: 文本

    当然,它需要连接,实现起来有点复杂,但更通用,如果索引正确,效率很高。

    【讨论】:

    • 为了解决安全问题,将作为新列的请求插入到“请求队列”表中。每 N 分钟运行一次作业来处理此表并根据需要创建列。该作业可以使用必要的权限运行。
    • 安全问题的另一个解决方案是在存储过程中完成 ALTER TABLE 的工作。让您的应用程序有权调用该存储过程,但不能调用 ALTER TABLE(或 DROP 等)。
    【解决方案3】:

    我认为向数据库表中添加新的自定义字段没有任何问题。

    通过这种方法,可以使用特定/最合适的类型,即需要一个 int 字段吗?将其定义为 int。而对于名称/值类型表,您会将多种数据类型存储为一种类型(可能是 nvarchar) - 除非您使用多个不同类型的列完成该名称/值表并填充适当的列,但这有点可怕.

    此外,添加新列可以更轻松地查询/无需涉及到新名称/值表的连接。

    它可能感觉不那么通用,但我觉得这比“一刀切”的名称/值表要好。

    从 SQL Server 的角度来看(2005 年以后)......
    另一种选择是存储创建 1 个 XML 类型的“自定义数据”字段 - 这将是真正通用的,不需要创建字段或需要单独的名称/值表。还有一个好处是,并非所有记录都必须具有相同的自定义数据(即一个字段是常见的,但它包含的内容不一定是)。不是 100% 的性能影响,但 XML 数据可以被索引。

    【讨论】:

    • 从 SQL 2008 开始,您可以选择专为此方法设计的稀疏列。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-04
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多