在MongoDB中存储自定义集合模板

时间:2018-05-27 15:36:06

标签: database mongodb database-design nosql

背景

我正在开发一个Web应用程序,要求用户创建和填写自定义表(想想HTML或MS Word表,而不是数据库表)。我们的想法是管理员将为这些表创建模板,一般用户将填充它们。每个普通用户都可以填写自己的模板,因此会有许多表使用相同的模板。

现在,这些模板可以容纳任意数量的列,每列可以具有不同的数据类型。它们也可以随着时间的推移而改变,这意味着应该有它们的版本。换句话说,一旦用户填写模板,即使模板将来发生变化,也应该使用该结构进行存储。它将保留旧版本的模板,而新用户将使用最新版本。

我通常使用关系数据库,但对于这种情况,关系数据库看起来不太合适。我觉得最终会得到一堆表,需要很多连接来提取我需要的数据,特别是如果数据库是规范化的。

我想过使用像MongoDB这样的东西。我是Mongo的新手,所以我确定我没有探索过每一个选项,但我认为这比使用MySQL(我用于其他应用程序)更好。但是,请告诉我,我是否错了。也许我错过了什么。

我希望能够存储模板(名称,列(按顺序,带有它们的名称和数据类型)),然后在每次用户想要填充它们时重用这些模板。我会使用一个集合来存储所有使用相同模板版本的表。也就是说,每次制作模板时都会创建一个集合。集合应该定义内部所有文档都应遵循的数据类型。如果我理解正确,MongoDB会为此提供模式验证。

我的方法和问题

  1. 如何在数据库中存储模板?我想将它们作为文档存储在“模板”集合中,这类似于下面的示例,但我担心将数据类型作为字符串。

    {
        name: <String>,
        fields: [
            {
                name: <String>,
                type: <String>    <----this is what I have an issue with
            },
            ...
        ]
    }
    

    我必须阅读这些模板并将其结构转换为HTML表格,以便用户可以填充它们,然后将它们作为文档存储在具有模板名称或ID的集合中。

    类似的东西:

    {
        template_id: <uuid, integer, string or something>
        name: <String>,
        rows: [
            {
                <field name>:<field value of specified type>,
                ...
            }
        ]
    }
    
  2. 动态创建集合的可行性和推荐性是什么?

  3. 如果有什么不清楚,请告诉我,我可以澄清一下。就像我说的,我是MongoDB的新手(以及一般的非关系数据库),所以如果我遗漏了一些明显的东西,请随意指出并提供建议。也欢迎有用的文档或教程链接。我也愿意尝试其他NoSQL解决方案。

1 个答案:

答案 0 :(得分:0)

我对在我的应用程序中在mongodb中存储模板有相同的想法。 您应该为项目使用标准模式,因为我们将为验证数据提供一些支持库。

  1. JSON架构: 当前版本是草案-07 http://json-schema.org/ 。您可以阅读有关架构标准的内容,并拥有许多程序语言的客户端库
  2. MongoDB的: 现在MongoDB 3.6支持验证JSon Schema draft-04 https://docs.mongodb.com/manual/core/schema-validation/#json-schema
  3. 在MongoDB中存储架构: 将Json模式存储在集合中时,我们会遇到问题。 Json Schema有一些不能存储在mongodb中的字符。 您可以参考https://accraze.info/storing-json-schema-templates-in-mongodb/