Database-Design
可擴展資產數據庫模式
背景
我在硬體行業的一家體面的公司工作。目前,我們有許多不同的資產需要跟踪。直到最近,這都是手工完成的,因為這是一種(顯然)容易出錯的做法。我們現在(最終)將其放入適當的 RDBMS 中,儘管尚未選擇確切的 DBMS。
值得慶幸的是,每項資產都已通過唯一的資產標籤/編號進行跟踪。
題
我試圖找出跟踪簽出和簽入的最佳方式。我已經對此事進行了一些Google搜尋,但我似乎無法找到我正在尋找的東西。我只需要跟踪給定資產何時簽出並隨後重新簽入。目前,我正在考慮三個主要選項:
- 入住和退房各一張桌子。這樣做的好處是清楚地分離了兩個概念並避免了任何 NULL 值。但是,它確實使對此類資訊的查詢更加複雜。
- 入住和退房都一張桌子;在不同的行簽入和簽出。這允許我重用同一張表,但需要大量的自連接才能得到任何東西。我也不喜歡依賴某種常量來區分“出”和“入”記錄。
- 入住和退房都一張桌子;入住和退房在同一行。這是我目前最喜歡的,因為它使查詢變得微不足道,並以一種非常容易理解的方式結合了這兩個概念(“輸出”和隨後的返回)。我唯一的猶豫是它依賴 NULL 來確定資產是否仍然被簽出。根據我的經驗,NULL 可能是一個苛刻的情婦,尤其是當設計獨立於 DBMS 時。
我知道其中很多可能取決於我的特定要求;然而,這個問題似乎很普遍,我希望有某種程度的預期最佳實踐,以及為什麼選擇這種實踐。
太長; 沒讀
哪種 RDBMS 無關設計技術最適合跟踪資產的簽出和簽入以及為什麼:
- 兩張桌子;退房和入住各一個
- 兩人一桌;‘out’ 與 ‘in’ 的不同行
- 兩人一桌;‘out’ 和 ‘in’ 在同一張唱片上
提前感謝您的幫助。
選項#3
NULL 是你的朋友。選擇平台後,研究 NULL 如何為平台工作並接受它們。在這種情況下,它們準確地反映了沒有簽到。在 Oracle NULLS 中沒有索引,因此您可以創建一個基於函式的索引來交換 NULL 狀態,從而為您提供一個非常小的索引,其中僅包含未簽入的條目。
選項 #1 在您想要入住日期或狀態的任何時候都需要加入。聯接也是您的朋友,但在這種情況下,分離這些數據沒有任何好處,除非有時單個結帳可以產生多個簽入。選項#2 需要重複數據甚至比選項#3 更多的NULLS。以下是表列和數據的三個概念。
#1 CheckOut Asset CheckInOut User DateTime 1 1 1 3/10/2013 2 2 1 3/10/2013 3 3 2 3/11/2013 CheckIn CheckInOut DateTime 1 3/11/2013 #2 CheckInOut Asset CheckInOut User DateTime InOrOut 1 1 1 3/10/2013 O 2 2 1 3/10/2013 O 1 1 1 3/11/2013 I 3 3 2 3/11/2013 O #3 CheckOut Asset CheckInOut User OutDateTime InDateTime 1 1 1 3/10/2013 3/11/2013 2 2 1 3/10/2013 3 3 2 3/11/2013
SQL Fiddle 展示了選項 #2 和選項 #3,以及 Joel Brown 添加的附加要求以及如何在 SQL 中回答各種問題。