2017-03-09 46 views
1

我正在爲一家大理石製造公司 創建一個應用程序,以跟蹤具有給定寬度和 高度的大理石生成過程。這跟蹤按位操作正確的解決以下問題?

這是我將如何組織我的數據的表模式。 第一個是StoneInfo其中包含基本信息有關 像「UNIQUE_ID,stone_id,stone_name,CREATION_TIME,last_purchase_time, generation_status」

UNIQUE_ID石頭 - 是隨機生成的ID - 這是保持與外鍵關係其他表StoneMetaDetails

StoneInfo

UNIQUE ID  (Primary key) 
STONE ID   (Indexed & Unique key) 
STONE_NAME  (Indexed & Unique key) 
CREATION_TIME 
LAST_PURCHASE_TIME 
GENERATION_STATUS 

爲了避免第二歸一化的異常我含有S分成兩張桌子。在這裏它包含有關指定維度中每種類型的石頭的創建狀態的詳細信息。創作狀態是一樣的東西

CREATED_SUCCESSFULLY 
CREATION_INPROGRESS 
CRAETION_ON_HOLD_DUE_TO_LESS_REQUIREMENT 
CREATION_ON_HOLD_DUE_TO_LACK_OF_RESOURCE 
CREATION_ON_HOLD_DUE_TO_LACK_OF_MACHINE 
CREATION_ON_HOLD 

StoneMetaDetails

UNIQUE ID   (FOREIGN KEY with on delete cascade) 
FORMAT    (PRIMARY KEY) 
DIMENSION   (PRIMARY KEY) 
CREATION_STATUS 
STORE_NAME 
WEIGHT 
QUANTITY_AVAILABLE 
MACHINE TYPE/MACHINE ID 

我想保持每個創作狀態和每種類型的石頭(其中可能有不同的口味和尺寸在其中)。我所要做的就是儘量減少桌面上的讀/寫操作,以便快速訪問。

我維護和兩個狀態值像GENERATION_STATUS CREATION_STATUS因爲

GENERATION_STATUS - 當它是(「生成」或「已暫停,因爲某些原因」或「生成過程已經開始/初始化」) CREATION_STATUS - 保持跟蹤其尺寸的特定石頭類型的確切狀態值。

在這裏,我想用按位或操作的幫助GENERATION_STATUS列值合併這兩列的值 - 通過分配不同的恆定值(2 ^關係)

//All these values are meant for stone type 

public static final long STONE_TYPE_MARBLE_20_X_30 = 2; 
public static final long STONE_TYPE_MARBLE_50_X_60 = 4; 
public static final long STONE_TYPE_MARBLE_10_X_60 = 8; 
public static final long STONE_TYPE_MARBLE_20_X_60 = 16; 
public static final long STONE_TYPE_MARBLE_40_X_60 = 32; 
public static final long STONE_TYPE_MARBLE_60_X_60 = 64; 


public static final long STONE_TYPE_LIMESTONE_10_X_30 = 128; 
public static final long STONE_TYPE_LIMESTONE_10_X_40 = 256; 

public static final long STONE_TYPE_TRAVERTINE = 512; 
public static final long STONE_TYPE_MARBLE = 1024; 
public static final long STONE_TYPE_GRANITE = 2048; (2^11) 

//Have alloted values for 2^0 to 2^14 for stone type 
//All these variables are meant for representing creation/generation status of a stone 
public static final long GENERATION_SUCCESS = 2^15; 
public static final long GENERATION_IN_PROGRESS = 2^16; 
public static final long GENERATION_ON_HOLD_DUE_TO_MINIMAL_REQUIREMENT = 2^17; 
public static final long GENERATION_ON_HOLD_DUE_TO_LACK_OF_MACHINE = 2^18; 


public static final long GENERATION_ON_HOLD_DUE_TO_MACHINE_COULD_NOT_GENERATE = 2^19; 

//Some ten to fifteen different types of generation error values may be possible 

,這樣我可以得到它而無需加入另一張表以加快訪問速度。

更清楚我試圖映射,

stone_id及其generation_statusStoneInfo表。因此,generation_status包含狀態值,與石頭類型及其尺寸無關。

ie; (STONE_A_10_X_20 | GENERATION_SUCCESS)| (STONE_A_20_X_30 | GENERATION_INPROGRESS)在一個列中。

這是可能的幫助下按位或?我的方式是否正確?或者請給我一個更好的方法來處理這個問題的替代方案。

感謝您的耐心閱讀這一長期問題的故事:)

+0

我試圖解釋我的問題...請在這裏評論,如果我必須添加更多的細節或編輯帖子,需要更多的信息.​​..以獲得更好的清晰度的問題:) – Natasha

回答

1

在MySQL,有兩種數據類型相關:

  • ENUM - 存儲爲1-或2-字節的整數,並且表示N個值的1。 (N被限制爲64K值 - 但是甚至幾百個是不實際的)。
  • SET - 存儲爲較大的整數,並且包含(內部)任何1位值的組合(1,2,4,8 ,等等,一個你在代碼中描述的)。 (設置限制爲64位,一個la BIGINT。)
  • ENUMSET都使用任意字符串(而不是數字)來表示值。

|運算符「ors」在一起的兩個位串。這適用於SET,但對於SET的一位沒有多大意義。

generation_status作爲ENUM有意義,不是一個集合 - 畢竟,狀態一次只能取一個值,是正確的嗎?因此,涉及GENERATION_SUCCESS的布爾表達式需要說(generation_status = "GENERATION_SUCCESS"),它解析爲TRUE或FALSE,表示爲1或0,可以用於布爾值|或邏輯OR

一個無關緊要的問題......在桌面上有三個唯一的鍵很少有意義,就像你在StoneInfo上看到的一樣。

2

簡單的答案是你會在正確的方向

據我所知,您已經知道此操作背後的邏輯,因此要確認這是在單個字段中存儲多個狀態的正確方法,我們可能不得不查看其他內容,並且在實現此操作時可能忽略不計。

請參閱this link以獲取更多基本解釋,我會建議使用它並將一些測試數據放入您的數據庫中,然後運行一些查詢來比較結果。 您可能會看到將它們保留在兩列中並在它們之間進行或操作並將兩列保留爲減少的位數可能會更快。我沒有檢查過這個,但是theoratically(數據庫管理員價格昂貴,存儲價格便宜),只需要8位來組合256個狀態就可以了,Stone Type狀態和Generation狀態將會很好。

Try它。

+0

我想將這兩個不同的值分開以避免加入 - 假定加入是一項代價高昂的操作。我對這個看法是否正確? – Natasha

+0

我可以說你對大多數情況是正確的。不過,請嘗試使用您的數據和配置文件性能和存儲,以根據您的需求進行優化。 –