首頁 > 後端開發 > php教程 > 在資料庫中怎麼做到所有使用者共用一張表,但是每個使用者的訂單編號卻是獨立的命名空間?

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

WBOY
發布: 2016-08-04 09:20:40
原創
1288 人瀏覽過

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之間的互換邏輯就行了。

<code>//伪码 
$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);</code>
登入後複製

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

解決方法


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

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

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板