Postgresql

設計:Postgres,父對子/子對父/子對子|JSONB

  • December 27, 2017

我對數據庫設計很陌生。我希望為我正在工作的功能提供建議或解決方​​案。

注意:我們主要在 Postgres 中使用 JSONB 類型

功能:我有一個訂單表,其中包含每個訂單資訊,每個訂單都有使用者訂購的唯一商品。

樣品訂單模式

{
   id: "parent_order_id_uuid",
   "items": [
       {
           item_id: "uuid-#1",
           details: {
               etc....
           }
       },
       {
           item_id: "uuid-#2",
           details: {
               etc....
           }
       }
   ]
}

我正在開發一項功能,即使用者可以多次更換他購買的物品。

例如-“uuid-#1”可以單獨替換,“uuid-#2”可以單獨替換,或者“uuid-#1”和“uuid-#2”n次替換。

所以每次使用者更換一個項目時,我都需要創建一個只包含被替換項目的新訂單。

樣品更換訂單:

{
   id: "order_id_uuid",
   "items": [
       {
           item_id: "uuid-#1",
           details: {
               etc....
           }
       }
   ]
}

{
   id: "order_id_uuid",
   "items": [
       {
           item_id: "uuid-#2",
           details: {
               etc....
           }
       }
   ]
}

要求:

  1. 在任何時候,我都需要能夠基於“parent_order_id_uuid”創建一個樹狀結構。
  2. 在任何時候,我都需要能夠根據“parent_order_id_uuid”查詢替換的訂單。
  3. 我需要在 parent_order_id 和 replacement_orderIds + parent_item_id 和 replacement_ids + replacement_ids 和 replacement_ids 之間建立關係

如何在 Postgres 中儲存這些數據以獲得所有這些要求,我再次同意將這些數據儲存為 JSONB。一些設計建議會對我有所幫助。

(父母對孩子+孩子對父母+孩子對孩子)

簡單地說一下我的要求:

N次父母對孩子

{
 "parent_order_id_uuid": [
   {
     "replacement_order_id_1": {
       "items": [
         {
           "parent_item_id": "uuid-#1",
           "item_id": "uuid-#3"
           "details": {
               etc...
           }
         }
       ]
     },
     "replacement_order_id_2": {
       "items": [
         {
           "parent_item_id": "uuid-#2",
           "item_id": "uuid-#4"
           "details": {
               etc...
           }
         }
       ]
     }
   }
 ]
}

如果這不是很冗長,請告訴我。

PS:這是我在 Database Stack 中的第一個問題。

在此先感謝您的幫助。

首先,一如既往a_horse_with_no_name 是正確的。讀這個

至於如何分解出你的 jsonb。您可以使用單表層次結構

CREATE TABLE items (
 item_id    serial  PRIMARY KEY
 parent_id  int     REFERENCES items,
 details    jsonb
);

至少通過這個方案,您已經刪除了 IDS。現在您只需使用遞歸查詢來查詢數據。

欲了解更多資訊,請查找

引用自:https://dba.stackexchange.com/questions/193971