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

时间:2010-08-23 04:45:27

标签: mysql mongodb postgresql couchdb database

我希望在我的数据库记录中包含动态字段。

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

用户可以创建以下表单:

个人资料:

  • 姓名
  • 工作
  • 电话
    • 主页
    • 工作
    • 移动
  • 兴趣
    • 兴趣1
    • 兴趣2
    • 兴趣3

工作:

  • 名字
  • 姓氏
  • 工作
      • 专业1
      • 专业2
      • 专业1
      • 专业2

国家:

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

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

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

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

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

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

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

考虑这个例子:

分类

  • 办公室

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

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

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

我总结了我的问题:

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

3 个答案:

答案 0 :(得分:3)

我强烈建议您查看CouchDB

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

答案 1 :(得分:2)

如果您的数据非常适合关系模型,但您需要存储一些不是很大的动态格式化数据,那么最好将JSON,XML或类似数据存储到列中。虽然你通过这样做(索引,外键约束检查,类型检查等)失去了一流SQL类型的一些优点,但是当你的查询不关心它们的内部时,它对于存储动态结构化文档是有好处的。 / p>

如果您对通过JSON / XML /等存储大部分关系数据感兴趣,我建议您查看PostgreSQL。 PostgreSQL有XML数据类型,但我不建议使用它,因为我讨厌XML:P。没有人阻止你将JSON存储在TEXT字段中,但PostgreSQL很快就会有一个带有支持功能的JSON数据类型。 hstore contrib模块提供了一种存储键/值对的有效方法,还提供了全文索引支持。

虽然将JSON或类似内容推入SQL数据库列中,但是在关系模型面前仍然很快,但通常情况下你最好这样做(当它有意义时!)。否则,您必须向数据库解释应用程序的整个模式,从而导致许多SQL和数据库映射代码确实无法执行任何操作。

答案 2 :(得分:-1)

要选择的数据库更多地取决于您想要查询的内容和方式,而不是您想要存储的内容。所有数据库都可以让你存储任何你想要的东西。

RDBMS特别擅长基于关系模型的查询,并且可以合理地随意进行查询。通过临时过滤器和连接,您可以做各种各样的魔术。

NOSQL数据库的查询灵活性往往较低,但在其他任务中表现较好(例如在“非结构化”数据上工作得更好)。

鉴于您在此处发布的内容,我只使用SQL数据库并按用户希望定义的方式定义表。设置索引,设置查询。听起来对我来说真的没脑子。 SQL DB可以轻松处理所有“即时定义字段”的内容,因为......这就是他们所做的。所以使用它。