代码之家  ›  专栏  ›  技术社区  ›  Imran

数据库设计:在运行时修改表模式实用吗?

  •  1
  • Imran  · 技术社区  · 14 年前

    假设我有一个products表,其中一些字段将被保留,而所有其他属性都是用户生成的可空列。

     (reserved)
         __
        /  \
       /    \
    --------------------------------------
    | id | name | color | height | width | 
    --------------------------------------
    

    与EAV一样,它将允许任意数量的属性,但这些属性也将是可查询的。这种方法的潜在缺点是什么?

    • 如果用户只控制 ADD/DROP COLUMN 语句是字段名(将始终对其进行验证以防止删除保留字段)?

    • 多贵啊 添加/删除列 当表变大时,语句可能会变大?假设我们设置了速率限制以避免用户滥用系统。

    • 从性能的角度来看,对于一个表,有多少列(可为空、未索引)太多?

    4 回复  |  直到 14 年前
        1
  •  3
  •   Paul Tomblin    14 年前

    使用第二个表和键/值对会更好。

    什么让你认为第二种方法是不可查询的?

    DDL语句不能在事务中。这可能取决于您正在使用的数据库引擎,但如果DDL必须等到其他事务完成,和/或在等待其他事务完成时阻塞所有其他事务,我也不会感到惊讶。换言之,演出会很糟糕。

        2
  •  0
  •   Bob Palmer    14 年前

    在运行时动态地修改关系数据库的模式是非常昂贵的,并且通常会产生一些不良影响(不是释放东西和吃掉孩子,而是接近;)

    所以我要看两个选择。

    1. 保留不同类型的通用字段名,使用配置数据库映射用户选择使用这些额外字段的内容,以便在自定义报告流程中有适当的列标题等(我在几个ERP包中看到了这一点)。

    2. 考虑使用允许存储不同对象(通常是JSON等格式)的非关系数据库

        3
  •  0
  •   DOK    14 年前

    不是将列添加到现有表中,而是如何 创建包含属性的键值对的第二个表 产品表上有外键吗?这将允许产品具有任意数量和各种属性,并且通过连接主键外键上的表可以方便地进行查询。

        4
  •  0
  •   Larry Lustig    14 年前

    在生产中,修改数据库模式是一个令人头疼的问题。 用户 修改数据库模式是当有人在卡车上碾过你,然后备份并再次攻击你时,你会感到头疼。

    用户在正常业务处理期间添加到数据库的信息(这包括 姓名 是数据,而不是模式信息,应该这样对待。