繁体   English   中英

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

[英]User-created database structure: non-relational or relational databases?

我想在数据库记录中包含动态字段。

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

用户可以创建以下表单:

个人资料:

  • 全名
  • 工作
  • 电话
    • 工作
    • 移动
  • 兴趣爱好
    • 利息1
    • 兴趣2
    • 兴趣3

工作:

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

国家:

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

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

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

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

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

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

我正在考虑的另一件事:是否将数据保存在非关系数据库中意味着我将有重复的条目?

考虑以下示例:

分类:

  • 办公室

    • 应用领域
      • 文字伴侣
        • 作者:Foobar
        • 价钱:120
      • oo
        • 作者:Foobar
        • 价钱:120
  • 办公室

    • 应用领域
      • 文字伴侣
        • 作者:Foobar
        • 价钱:120
      • 酒吧
        • 作者:Foobar
        • 价钱:120

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

我总结一下我的问题:

  • 用户创建的数据库结构是哪种类型的数据库?
  • 用于存储安全性关键信息的非传统数据库吗?
  • 非真实数据库如何处理重复项?

我强烈建议您为此查看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

使用CouchDB,您可以避免为用户可能创建的每种表单动态创建唯一表的麻烦。

如果您的数据非常适合关系模型,但是您需要存储一些动态格式化的数据,这些数据不是很大,那么最好将JSON,XML或类似的数据存储到列中。 尽管这样做会使您失去一流SQL输入的某些优势(索引编制,外键约束检查,类型检查等),但是当您的查询不太在意它们的内部时,它对于存储动态结构化文档非常有用。

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

尽管将JSON或类似的东西推到SQL数据库列中虽然是关系模型的事,但是您通常还是最好这么做(在有意义的时候!)。 否则,您必须向数据库解释应用程序的整个架构,从而导致很多SQL和数据库映射代码实际上什么也没做。

选择的数据库更多地取决于您要查询的内容和方式,而不是要存储的内容。 所有的数据库将使您几乎存储任何您想要的东西。

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

NOSQL DB的查询灵活性较差,但在其他任务上却做得很好(例如,对“非结构化”数据的处理更好)。

鉴于您在此处发布的内容,我将只使用一个SQL数据库并按照用户想要的定义表。 设置索引,设置查询。 听起来对我来说真是不费吹灰之力。 SQL DB可以轻松处理所有这些“动态定义字段”的内容,因为...这就是它们的工作。 所以用那个。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM