Database-Design

可擴展資產數據庫模式

  • March 12, 2013

背景

我在硬體行業的一家體面的公司工作。目前,我們有許多不同的資產需要跟踪。直到最近,這都是手工完成的,因為這是一種(顯然)容易出錯的做法。我們現在(最終)將其放入適當的 RDBMS 中,儘管尚未選擇確切的 DBMS。

值得慶幸的是,每項資產都已通過唯一的資產標籤/編號進行跟踪。

我試圖找出跟踪簽出和簽入的最佳方式。我已經對此事進行了一些Google搜尋,但我似乎無法找到我正在尋找的東西。我只需要跟踪給定資產何時簽出並隨後重新簽入。目前,我正在考慮三個主要選項:

  1. 入住和退房各一張桌子。這樣做的好處是清楚地分離了兩個概念並避免了任何 NULL 值。但是,它確實使對此類資訊的查詢更加複雜。
  2. 入住和退房都一張桌子;在不同的行簽入和簽出。這允許我重用同一張表,但需要大量的自連接才能得到任何東西。我也不喜歡依賴某種常量來區分“出”和“入”記錄。
  3. 入住和退房都一張桌子;入住和退房在同一行。這是我目前最喜歡的,因為它使查詢變得微不足道,並以一種非常容易理解的方式結合了這兩個概念(“輸出”和隨後的返回)。我唯一的猶豫是它依賴 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 中回答各種問題。

#2- http://www.sqlfiddle.com/#!4/55e72/25

#3- http://www.sqlfiddle.com/#!4/e2f27/6

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