【问题标题】:NoSQL - Database Design: How To Properly Design Or Represent an Association In A NoSQL Database Schema?NoSQL - 数据库设计:如何在 NoSQL 数据库模式中正确设计或表示关联?
【发布时间】:2019-10-03 04:40:27
【问题描述】:

我正在为我正在开发的洗车应用程序设计一个数据库,我想知道一些事情。该数据库将位于 MongoDB 或 Firebase/Firestore 上。与此同时,我花了很多时间来概念化数据库,这就是我想出的:

我想指出,尽管这种设计包含主键 (PK) 和外键 (FK),但当我实际构建数据库时,它们不会这样表示。相反,它们将只是对外部文档/表格的引用。所以这是我的问题:

  1. 你们认为最简单形式的数据库设计正确吗?如果不是,我做错了什么?
  2. 你们认为OrderDetailsServiceAddonsOrder之间的关系构造正确吗?
  3. 应该将Business 连接到Order 而不是Service
  4. 在实际构建数据库(MongoDB/Firebase/Any NoSQL)时,我应该如何表示OrderDetails?作为Order 内的嵌入文档,反之亦然。我有点困惑,这是我的尝试;请让我知道你在想什么。

    let order = {
        'order_id':'jxde5retvggfffgggv',
        'customer_id':'hdksjf456jvvhgkk',
        'date':'05-14-1985 13:00',
        'total_amount':'1500',
        'order_detail':[{
            'order_id':'jxde5retvggfffgggv',
            'service_id':'ope4fghgi9nnsgu',
            'addon_id': '4fhtyucfjfigpq9fh',
            'quantity': 20
        },
        {
            'order_id':'jxde5retvggfffgggv',
            'service_id':'7reaolmdgfirgt8om',
            'addon_id': 'sd2aqerthnnmgdpmb',
            'quantity': 35
        }]
    }
    

[更新 - 2019 年 10 月 5 日] 数据库设计

我刚刚意识到需要清洗的车辆应该是订单的一部分,所以我稍微改变了设计以反映这一点。通过这样做,我仍然可以确保仍然可以从订单中访问客户,因为 customer_id 已附加到车辆。请让我知道你在想什么。

【问题讨论】:

    标签: database mongodb firebase database-design nosql


    【解决方案1】:

    如果不了解您的确切功能要求和实体的语义,就无法给出前三个问题的答案。

    1. 总的来说,您的设计看起来不错。但是,我对 Business、Service 和 Wash Type 的语义理解得不够好,无法确定。您接下来的两个问题表明模型的那部分可能存在问题。

    2. 由于服务包含作为 FK 的wash_type_id,因此图中的一对多方向可能应该是相反的方向。我不太明白这种关系的含义。由于服务包含描述和单价,我想这是对客户的报价。但是为什么(可能)许多服务都指向相同的清洗类型?可能将这两者分开是有意义的,但在不了解您的业务需求的情况下很难理解这一点。

    3. 我不确定业务实体的语义。不同的实例是否指不同的公司提供洗车服务?如果是这样,答案可能应该是否定的,因为不同的公司不太可能共享相同的服务。但是,如果 Business 仅表示同一公司的分支机构,那么所有 Business 实例的服务提供可能都是相同的,并且 Business 可能会连接到 Order。取决于您的要求。

    4. 我不熟悉 Mongo 和 Firebase,但我知道 Couchbase。嵌套对象的一般设计考虑是您只能通过指向其 id 从其他对象引用顶级对象。因此,您建议的解决方案是可以的,只要您只引用来自其他对象的订单,而不是特定的 OrderDetails。对于很多用例来说,这应该没问题。但是,这将使得对使用特定服务的所有 OrderDetails 进行评估变得困难 - 找到打开所有订单的方法,以了解它们的某些详细信息是否涉及该服务。反之亦然,完全没有意义。 OrderDetail 包含在 Order 中,而不是相反。将 OrderDetail 设为根并在其中包含 Order 意味着为每个 OrderDetail 实例重复重复订单数据。但是,如果您想让 OrderDetail 成为第一类对象,则可以将其与 Order 完全分开。

    【讨论】:

    • 感谢您就此事回复我。 1. Think is a Business as a Car Wash 可以提供 xple Car Wash Services。一个特定的Service 只属于一个Wash Type。 2.Wash Type可以包括xpleServices,这意味着客户可以订购xpleWash Type,而xpleServices又包括xpleServices。 3. 是的。新业务的不同实例。就我而言,Business 的实例意味着不同的洗车场。我还没有处理 xple 位置。所以我建议我保留:业务 -> 服务? 4. 明白了。请检查问题。我对其进行了更新。
    • 我还是不明白Service和WashType区别的意义。也许一个例子会有所帮助。根据我洗车的经验,是的,一种洗车类型可能包含多种服务,例如预洗、洗涤、打蜡和烘干。但随后客户订购的是洗涤类型,而不是单一服务。
    猜你喜欢
    • 2012-12-08
    • 2020-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    • 1970-01-01
    • 1970-01-01
    • 2019-01-03
    相关资源
    最近更新 更多