【问题标题】:Flexible forms and supporting database structure灵活的表格和支持的数据库结构
【发布时间】:2011-06-03 17:02:48
【问题描述】:

我的任务是创建一个应用程序,该应用程序允许管理员更改用户输入表单的内容(即添加任意字段) - 其内容存储在数据库中。想想 Modx/Wordpress/Expression Engine 模板变量。

我一直在研究的方法是实现规范一致的具体表(即用户配置文件、用户内容等)和一些通用字段数据表(即文本、布尔值)来存储非特定值。表单(和模型字段)将通过首先查询表并检索相关列来生成 - 尽管我还没有考虑如何设置验证。

我已经看过这个问题,它似乎表明了一种 EAV 类型的方法——根据我的简短研究——看起来它可能比它的灵活性带来的好处更大。

然而,我在这里阅读了几篇文章,这表明这是一条危险的路线:

How to design a generic database whose layout may change over time?

Dynamic Database Schema

如果有人可以提供一些建议,我将不胜感激

问候

SWK

【问题讨论】:

    标签: php mysql database-design


    【解决方案1】:

    几年前我创建了一个非常大的 EVA 数据库(PHP w/PostgreSQL)。结果很好,但这是一个大项目($$$)。所有表单都是完全动态的,具有表单/字段版本控制、发布工作流程、匹配动态报告等。

    EVA 基础很简单。获取数据并不是困难的部分。但是表单版本控制和报告....您可以花费数年时间才能做到正确。

    如果我今天再做一次,我会使用一种较新的 NoSQL 解决方案 (http://en.wikipedia.org/wiki/NoSQL#Document_store) 进行研究。我想创建一个可以传递给表单生成器的 DTO 样式类。 “修改”表单实际上是修改 DTO。然后我会将该 DTO 持久化到文档/对象数据库中。

    此外,在构建 Alpha 版解决方案时,请考虑如何解决包含版本控制和报告需求的测试用例。

    这是我的意思的一个例子:一个简单的“表单”。

    • 原始(版本 1):有 First,Last,Question
    • 添加电子邮件字段(版本 2):First,Last,Email,Question
    • 有人改变了对电子邮件的看法:(版本 3):First,Last,Question
    • 新的营销人员进来并更改它:(版本 4):全名、电子邮件、问题

    现在,您需要生成一份报告 (csv)。事情变得棘手。你是怎么做到的?

    我们通过引用之前版本的字段级版本控制解决了这个问题。另外,报表系统需要最终用户在运行前组装报表数据源的定义。 (将报告字段绑定到数据字段等)。

    但是,对于文档数据库,我想您可以以不同的方式进行操作。我相信像 CouchDB(其他??)这样的新数据库具有内置的机制来处理这些问题。

    祝你好运!!

    【讨论】:

      【解决方案2】:

      在我上一个 web 应用中开发用户配置文件时,我选择了 键/值表 方法。这是我的数据库设计的外观:

      Users table with fixed columns:
      id
      login
      name
      regdate
      

      与 Profiles 表(User HasMany Profile)链接的用户表。

      Profiles table with different data:
      user_id
      field
      value
      

      这样,用户可以将任何附加字段添加到他的个人资料中。例如:

      user_id = 1    
      field = 'Facebook'
      value = 'http://facebook.com/...'
      

      user_id = 1
      field = 'Stackoverflow'
      value = 'http://stackoverflow.com/user/...'
      

      等等..

      【讨论】:

        【解决方案3】:

        根据您的需要,甚至将表单字段提升到“数据库字段”级别可能都不值得。相反,您可以在(本质上是一个)动态 blob 中序列化这些字段并将其存储在数据库中。如果您有人需要在您的应用程序之外查询这些动态字段(即,数据库设计是与集成系统的更大公共合同的一部分),则不建议这样做,但如果您只是使用该应用程序来简单地进行持久化这些动态字段,或者如果字段中的任何聚合/搜索功能很小,那么我会考虑它(尤其是这些天给定的 CPU 功能)。我已经多次使用该模式,而且我 - 到目前为止 - 从来没有重构过。 (但是,我可以理解您可能需要这样做的情况)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-10-10
          • 1970-01-01
          • 1970-01-01
          • 2013-03-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多