2011-04-28 89 views
8

我想顯示來自網頁中的數據庫(SQL SERVER 2005)表的行。這些行包含status狀態表(例如id,name,modifiedDate)進一步定義的statusID(外鍵)。將演示數據存儲在數據庫中可以嗎?

各種狀態應顯示不同(讓他們說,他們只是有不同的背景顏色)。

我使用php來查詢數據庫,並建立網頁表。在構建表格時,我將根據該行的狀態將css類應用於元素。

我至少有2個選項來做到這一點:

  1. 定義在PHP代碼的邏輯來處理它,如果狀態在數據庫中改變,我將不得不更改代碼。

  2. 將「類」存儲在數據庫中,並簡單地應用已存儲的類。

後面的選項對我來說似乎更好,但我不確定將表示數據嵌入到數據庫中是否是一個糟糕的設計選擇。這將是我創建多個Intranet實用程序的基礎,我想從右腳開始。

+0

我把它的 「應用CSS類」 你的意思是應用類_attribute_? ;) – 2011-04-28 17:43:21

+1

公約可以配置嗎?我只需爲狀態表中的每條記錄創建一個「status_ 」CSS類...只需應用一些標準字符串修改即可刪除不適合CSS類名稱的空格和其他字符。 – Schwartzie 2011-04-28 17:45:24

+1

你是否想過要添加許多不同的狀態?如果您允許用戶自定義狀態以及它們的外觀,那麼您不會存儲類信息 - 因爲它們不能添加類。您可能正在存儲特定的自定義選項,如背景顏色或字體顏色。通常地位是明確的,不應該有太大的變化。一個簡單的函數,如GetStatusClass(s​​tatusValue),返回適當的類應該不會有太大變化。 – Prescott 2011-04-28 17:47:46

回答

4

在數據庫中存儲任何數據(包括演示數據)沒有任何問題。如果它能幫助你產生有效的結果,同時減少代碼,那麼這是一個好習慣。你需要確保的是你不要混合你的表示邏輯和你的數據庫邏輯

您可以通過將表示層的數據封裝在elementInfo對象的屬性中(例如)來確保分隔這些問題。

既然是你所談論的CSS類,這演示數據應保持在業務數據分開。因此,雖然可以將演示數據和業務數據存儲在數據庫中,但將它們存儲在同一個表中是不可接受的。

更新重新:評論不,您不應該添加PresentationClassRecord的Id作爲業務對象上的FK。我對下面的db做了一個示例。我打電話給您的業務對象DummyTable,其餘的遵循規範。最相關的部分是StatusPresentationAssignmentTable

----------------------------------------------- 
DummyTable 
----------------------------------------------- 
Id  Name  SomeOtherDataField StatusId 
PK int varchar int     FK int 

----------------------------------------------- 
StatusTable 
----------------------------------------------- 
Id  Name  ModifiedDate 
PK int varchar datetime 

----------------------------------------------- 
PresentationTable 
----------------------------------------------- 
Id  PresentationType Value 
PK int varchar    
sample data: 
43  CssClass   prettyBackground 

----------------------------------------------- 
StatusPresentationAssignmentTable 
----------------------------------------------- 
StatusId PresentationId 
FK int  FK int 

現在用兩個簡單的加入條款,您能得到的演示數據,它是完全從業務數據分離。您的腳本可以執行諸如檢查虛擬狀態是否具有任何演示文稿分配的操作。如果確實如此,它將查看PresentationType,獲取適當的函數將演示數據應用於演示文稿,然後執行它。 (您需要爲每個PresentationType擁有一個函數,該函數知道如何處理該值 - 可以使用類似function applyPresentationValue(presentationElement, presentationType, presentationValue)的東西封裝該函數,該函數調用不同的函數applyCssClass(presentationElement, value),如果該值爲presentationType == "CssClass")。

+0

將另一列鏈接到「表示」表創建此圖層分離? – LittleTreeX 2011-04-28 17:48:10

+0

@LittleTreeX,請參閱更新。 – smartcaveman 2011-04-28 18:04:59

+0

我喜歡這個例子。但是,在這種特殊情況下,這意味着我會創建許多額外的小型分配表(假設我在整個應用程序中應用了這種意識形態)。我是否應該關心這一點,並且通過連接和額外表格來降低性能? – LittleTreeX 2011-04-28 18:18:21

4

該類本身並不是真正的表象數據。這只是每種狀態的標籤。理論上,您可以將其用於許多事情,而不是決定網頁上顯示狀態的顏色。

當您將該類與一組給定樣式相結合時,然後是它是表示信息。你會在你的CSS文件中這樣做,而不是在數據庫中。

但是,如果數據庫中的狀態發生更改,則選項1不一定要求您更改PHP代碼。您的PHP只能從狀態的idname生成類名。如果狀態的ID /名稱改變了,你的CSS將不得不改變,但是可能嗎?如果應用程序需要表示的狀態發生變化,每個狀態是否應該保持不變,添加新的狀態?

1

我看到存儲在數據庫中的優點和缺點。顯然,在那裏獲得班級信息很方便,但它並不是應用程序的真正組成部分。

我會傾向於不把它存儲在那裏,並根據狀態來處理表示層。我的推理是因爲,尤其是因爲你正在創建實用程序,所以數據可能會通過API或稍後類中毫無意義的東西使用。

3

儘管可以將css類信息存儲在數據庫中,但許多內容管理系統都這樣做,您最好將狀態作爲類名的一部分。

即 狀態=打開,關閉 使用PHP邏輯生成錶行設置CSS類狀態_ {名} 那麼任何時候你添加一個新的狀態或重新命名它,你只需要添加/編輯CSS文件,不需要PHP重新編碼。

.status_open{background-color:green;}

.status_closed{background-color:red;}

相關問題