在資料庫中怎麼做到所有使用者共用一張表,但是每個使用者的訂單編號卻是獨立的命名空間?

來源:互聯網
上載者:User
1.實際情境:
資料庫中訂單表是公用的,所有使用者在一張訂單表上。
怎麼讓每個使用者的訂單編號是獨立的命名空間?比如使用者A下了兩張訂單,他的訂單編號應該是C001、C002,使用者B下了三張訂單,他的編號起始位置應該還是C001,而不是C003,他的所有訂單編號應該是C001,C002,C003。
請問怎麼做到這一點?
難道要在每個使用者底下存一個他當前開了多少個訂單的欄位,然後每次先讀出來,加一,再存回去?這不太好吧……有沒有更好的方法,在資料庫端就做了?好像聽人說起過用資料庫函數或者觸發器?

2.如果資料庫能做到上述這一點,請問這個C001一般是存在主鍵欄位裡嗎?還是主鍵依然是一個數字類型的遞增主鍵,只是在表中增加一個欄位去存這個C001?

註:是在Mysql資料庫中。

回複內容:

1.實際情境:
資料庫中訂單表是公用的,所有使用者在一張訂單表上。
怎麼讓每個使用者的訂單編號是獨立的命名空間?比如使用者A下了兩張訂單,他的訂單編號應該是C001、C002,使用者B下了三張訂單,他的編號起始位置應該還是C001,而不是C003,他的所有訂單編號應該是C001,C002,C003。
請問怎麼做到這一點?
難道要在每個使用者底下存一個他當前開了多少個訂單的欄位,然後每次先讀出來,加一,再存回去?這不太好吧……有沒有更好的方法,在資料庫端就做了?好像聽人說起過用資料庫函數或者觸發器?

2.如果資料庫能做到上述這一點,請問這個C001一般是存在主鍵欄位裡嗎?還是主鍵依然是一個數字類型的遞增主鍵,只是在表中增加一個欄位去存這個C001?

註:是在Mysql資料庫中。

1:資料庫中不用那樣存,你只需要遍曆出來所有定單之後,顯示時按順序就行了。
2:給每個使用者屬性中增加靜態成員變數,並且資料庫中相應增加欄位,每次加入的資料就是你說的樣子了。

樓主的意思應該是建立不同客戶賬戶的統一訂單管理庫,不同賬戶只能看到屬於自己的訂單,有點類似雲erp。

訂單表可以冗餘一個主鍵id,在資料存放區唯一性上面,可以看為訂單code+使用者id來唯一確認一條資料。

如果說需要表結構最佳化設計的話,可以根據每個使用者自動建立一張訂單表,將每個使用者的訂單資料獨立出來,表名類似order_userid 每次根據使用者找到對應表名取資料,但在最後的綜合後台對所有使用者訂單資料統計可能會稍微麻煩些。

請問你如何保證訂單的唯一

如果根據題述意思設計資料庫,則僅尋找訂單這一操作就將出現異常。因為我們根據訂單號無法確定唯一訂單
主鍵的值用於唯一地標識表中的某一條記錄。

(關於你的項目
我建議:
訂單這張表的主鍵可以是OrderId
而使用者表的主鍵可以是UserId
我認為您的問題應該出在資料庫表的基本理解上。建議閱讀資料庫正常化的相關內容。)

  1. 用一個orderid表存放所有使用者下一個order的id,如果覺得麻煩建議你用時間作為訂單號的一部分。

  2. 不能作為主鍵,主鍵設計有一個原則——必須是和業務無關的。所以主鍵永遠都是無意義的自增ID之類的。

我看不出你這個問題是要解決什麼實際的需求

表結構的設計,要遵守最基本的三個範式的要求。三個範式的目的,是要保證欄位之間不要有冗餘,不要有依賴。上面幾位說的問題,我就不重複了,你這樣設計,違反了資料庫表結構設計的三大範式的原則,建議你好好理清楚需求,不應該做這樣的設計,或者我們理解錯了,你把問題重新表述一番。或者直接貼出你的建表語句來。

可以使用聯合主鍵將uid和cid組合起來,這就就可以保證唯一性了。但要注意如下兩點:
1、要使用mysql聯合主鍵自增,需使用MyISAM作為儲存引擎。
2、使用聯合 主鍵自增的時候,自增鍵不能是主鍵最左的鍵。

order表裡面增加一個user_owner_order_key,然後自己寫代碼處理 C001 這種東西與真實order_id之間的互換邏輯就行了。

//偽碼 $user_owner_order_id = (select count(*) from order where user = $uid and order_id < $currentOrderId order by order_id asc) + 1;$user_owner_order_key = $uid . fillZero($user_owern_order_id);

說一個其他方面的問題,一般的第三方支付對於同一個訂單號是無法多次付款的,所以最好考慮清楚要不要這樣做。

解決方案

  1. 使用者表可以有一個欄位存放訂單數量,每次有新訂單就取這個值加一,然後更新回去;

  2. 新訂單擷取已有訂單的條數,加一,不過這個刪除訂單的時候必須是虛刪除了

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.