使用ALTER TABLE实现自定义字段

时间:2010-02-05 13:03:58

标签: mysql sql-server database custom-fields

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

我知道有不同的方法来实现自定义字段(例如使用名称/值表或使用alter table等),我们目前支持使用ALTER TABLE向数据库动态添加新用户字段。

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

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

3 个答案:

答案 0 :(得分:2)

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

其次,您如何区分每个用户所需的字段?或者用户B创建的字段是否可由用户B访问?

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

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

  1. 使用序列化字段
  2. 我会在表格中添加一个文本字段,用于存储序列化词典或词典:

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

    缺点是这些值不容易搜索。

    1. 使用多种类型的名称/值表
    2. 字段表:

        

      user_id:int
        field_name:varchar(100)
        type:enum('INT','REAL','STRING')

      值表:

        

      field_id:int
        row_id:int#主表行id   int_value:int
        float_value:float
        text_value:text

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

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

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

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

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