2012-07-29 47 views
1

我有以下問題:我在數據庫中存儲項目列表並在網頁上顯示它們。我需要爲網頁上的每個項目分配id或class。最直接的方法是分配與數據庫中相同的ID。這裏有一個例子:數據庫ID和HTML ID之間的鏈接

數據庫

ID | Name 
----+----------- 
1 | Apple 
2 | Orange 
3 | Banana 

HTML

<ul> 
    <li id="1">Apple</li> 
    <li id="2">Orange</li> 
    <li id="3">Banana</li> 
</ul> 

明顯的問題是,HTML ID不能以數字開頭。所以,我想過放棄id的前綴,例如:

<ul> 
    <li id="f1">Apple</li> 
    <li id="f2">Orange</li> 
    <li id="f3">Banana</li> 
</ul> 

但這創建HTML和數據庫之間的不一致,並與對象比較複雜的工作。爲了解決這個問題,我將不得不一個新列添加到數據庫:

ID | Name  | HTML_ID 
----+-----------+--------- 
1 | Apple | f1 
2 | Orange | f2 
3 | Banana | f3 

似乎並非是理想的解決方案無論是作爲現在我需要手動輸入HTML_ID到數據庫我每次添加一個新項目時。我需要確保HTML_ID始終是唯一的。

我確定人們在網頁開發時經常碰到這個問題。我想知道是否有比上面的例子更好的處理方法。

回答

1

在將id放入HTML之前動態添加前綴,並在搜索數據庫之前刪除前綴。在清潔數據庫和清潔代碼之間進行選擇時,請選擇清潔數據


存放前綴id數據庫:

  1. 表中的廢物空間本質上是冗餘數據。更大的數據實際上意味着「更小」的緩存。
  2. 既然你想搜索它,需要一個索引。這是一個索引此外id索引您不能再用於查詢,但仍然需要強制唯一性。在所有情況相同的情況下,如果您的表是clustered*,則每個附加索引都會使INSERT/UPDATE/DELETE速度更慢並且可能會更加昂貴。並且還可以用作「大數據」,使緩存「更小」。

如果你的DBMS支持適當的機制**,你實際上並不需要物理存儲領域 - 數據庫管理系統可以計算出它的飛行對你來說,呈現點(1)無關。

但是,您仍然需要爲它編制索引,因此第(2)點仍然相關。


*一些的DBMS甚至都不給你一個選擇的關斷集羣(MySQL的/ InnoDB的)。

**如計算列可以索引或索引VIEW。

+0

我結束了你的建議,事實證明,這實際上很簡單:在調用數據庫時,在呈現html時將其移除時添加id。謝謝! – finspin 2012-07-31 20:37:07

0

直觀地使用原始數據庫ID似乎是一個糟糕的主意,因爲您不能一次使用多個表而沒有衝突的ID。答案只是決定一個明智的方法來將id重寫爲HTML的某些內容。一個可靠的方法是將表名和id連接起來,這意味着你不能有任何衝突的id。這樣做的缺點是,您會將大量有關數據庫的信息放入頁面中,您可能會考慮安全問題。

+0

感謝您的評論。你提出一個關於原始ID不太好的主意,儘管現在不是一個問題,因爲我只用一張表工作。如果我要添加更多表格,這可能會成爲一個問題。 – finspin 2012-07-29 14:03:40

1

你肯定不應該在數據庫中存儲HTML標識。在渲染頁面的位置添加前綴時會出現什麼問題?當然,另一個明顯的問題是爲什麼你需要爲每個列表項元素分配一個不同的ID?

+0

我需要爲每個列表項目分配不同的ID,因爲我正在對這些項目執行一些jQuery效果,所以我需要能夠通過某種ID識別每個項目。在渲染時添加前綴的問題又與jQuery(和Ajax)有關。我使用ajax從數據庫中提取了一些額外的數據,因此列表項和數據庫對象之間必須有一個公共標識符。我當然可以在執行ajax調用之前移除前綴,但這正是我試圖避免的那種複雜情況。 – finspin 2012-07-29 13:59:51