用户创建的数据库结构:非关系数据库或关系数据库?

nev*_*ame 8 mysql database postgresql couchdb mongodb

我想在我的数据库记录中有动态字段.

例如:我想为用户构建一个应用程序来创建自己的表单.

用户可以创建以下表单:

个人资料:

  • 全名
  • 工作
  • 电话
    • 工作
    • 移动
  • 兴趣
    • 兴趣1
    • 兴趣2
    • 兴趣3

工作:

  • 名字
  • 工作
    • 部门
      • 专业1
      • 专业2
    • 部门
      • 专业1
      • 专业2

国家:

  • 美国
    • 状态
      • 纽约
        • 城市
          • 纽约
      • 阿拉巴马
        • 城市
          • 酒吧
          • 巴兹

正如您所看到的,这是一个非常动态的结构:

  • 没有预定义的字段数
  • 没有预定义字段名称
  • 用户创建数据库的结构

所以我想知道,最好的数据库是什么:关系(mysql/postgresql)或者像mongodb/couchdb/cassandra这样的非关系数据库,甚至像xindice这样的xml数据库?

即使我为此选择非关系数据库,将安全关键信息存储在客户和计费信息中是否明智?

我听过有人说,如果您的信息需要唯一性,那么请使用关系数据库."我们不想冒两次向客户收费的风险".他们实际上意味着非关系型数据库存在哪些问题?您不能在非关系数据库中存储唯一数据吗?

我想到的另一件事:不会在非关系数据库中保存数据意味着我会有重复的条目吗?

考虑这个例子:

分类:

  • 办公室

    • 应用
      • TextMate的
        • 作者:Foobar
        • 价格:120
        • 作者:Foobar
        • 价格:120
  • 办公室

    • 应用
      • TextMate的
        • 作者:Foobar
        • 价格:120
      • 酒吧
        • 作者:Foobar
        • 价格:120

如您所见,存在相同条目的情况.非关系数据库如何处理这些?我很习惯关系数据库.

我总结了一下我的问题:

  • 用户创建的数据库结构的数据库类型是什么?
  • 用于存储安全关键信息的非实用数据库吗?
  • 非实际数据库如何处理重复?

Ben*_*man 3

我强烈建议您查看CouchDB来了解这一点。

  1. 您可以使用简单的 REST API 与 CouchDB 进行通信。换句话说,它是“由 Web制成”,而不是像 MongoDB 等那样简单地作为后端数据库。CouchDB 实际上可以提供表单服务并接收提交,因为它有一个内置的 Web 服务器。
  2. 作为 JSON 文档存储,它非常适合存储结构化但无模式的数据。(表格及其提交的内容实际上是文档,以这种方式建模更有意义,IMO。)
  3. 您可以轻松地将描述每个 Web 表单的 JSON 文档存储在与表单提交相同的“存储桶”中。(CouchDB 甚至可以解析表单 POST 并将其转换为您认为合适的 JSON 文档。例如,让它自动为表单提交添加时间戳就很简单。)
  4. 您可以编写所谓的“_show”函数来在 CouchDB 中实际生成每个表单的 html 代码。另请查看“_update”和验证函数。
  5. 它具有您需要的安全功能。
  6. 可以轻松识别文档冲突。更好的是,CouchDB 会自动确定文档的“获胜”版本,但您将继续访问“失败”的文档版本(直到您告诉 CouchDB 压缩数据库,这会删除旧的修订版本。)
    • 关于唯一性:您需要分配一个真正代表唯一表单提交的 _id,而不是让 CouchDB 生成唯一的 doc _id。如果每个用户每个表单只允许提交一次,则对从表单提交创建的每个 JSON 文档使用以下内容:submission:user:5:form:a3df2a712

使用 CouchDB,您可以避免为用户可能创建的每个表单动态创建唯一表的痛苦。