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
我認為您的問題應該出在資料庫表的基本理解上。建議閱讀資料庫正常化的相關內容。)
用一個orderid表存放所有使用者下一個order的id,如果覺得麻煩建議你用時間作為訂單號的一部分。
不能作為主鍵,主鍵設計有一個原則——必須是和業務無關的。所以主鍵永遠都是無意義的自增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);
說一個其他方面的問題,一般的第三方支付對於同一個訂單號是無法多次付款的,所以最好考慮清楚要不要這樣做。
解決方案
使用者表可以有一個欄位存放訂單數量,每次有新訂單就取這個值加一,然後更新回去;
新訂單擷取已有訂單的條數,加一,不過這個刪除訂單的時候必須是虛刪除了