2011-09-04 32 views
0

看看下面的items表,你可以看到這個表沒有被標準化。名稱應該在一個單獨的表格中對其進行標準化。數據庫規範化和數據輸入(管理後端)

mysql> select * from items; 
+---------+--------+-----------+------+ 
| item_id | cat_id | name  | cost | 
+---------+--------+-----------+------+ 
|  1 | 102 | Mushroom | 5.00 | 
|  2 |  2 | Mushroom | 5.40 | 
|  3 | 173 | Pepperoni | 4.00 | 
|  4 | 109 | Chips  | 1.00 | 
|  5 |  35 | Chips  | 1.00 | 
+---------+--------+-----------+------+ 

此表是不是因爲在後臺管理界面規範,工作人員只需選擇項目名稱的類別和類型來快速添加數據。這很快。有數百個相同的項目名稱,但成本並不總是相同的。

如果我做這個表正常化是這樣的:因爲這個表已經常態化的管理後臺(視野數據錄入點)

mysql> select * from items; 
+---------+--------+--------------+------+ 
| item_id | cat_id | item_name_id | cost | 
+---------+--------+--------------+------+ 
|  1 | 102 |   1 | 5.00 | 
|  2 |  2 |   1 | 5.40 | 
|  3 | 173 |   2 | 4.00 | 
|  4 | 109 |   3 | 1.00 | 
|  5 |  35 |   3 | 1.00 | 
+---------+--------+--------------+------+ 
mysql> select * from item_name; 
+--------------+-----------+ 
| item_name_id | name  | 
+--------------+-----------+ 
|   1 | Mushroom | 
|   2 | Pepperoni | 
|   3 | Chips  | 
+--------------+-----------+ 

現在,我怎麼添加項(數據)?我不想要一個下拉菜單來選擇項目名稱 - 將有成千上萬個不同的項目名稱 - 需要很長時間才能找到項目名稱,然後輸入成本。

需要有一種快速添加項目/數據的方法。這有什麼解決辦法?我在PHP中開發了後端。

還有什麼解決方案來編輯​​項目名稱?工作人員可能會將項目名稱完全重命名爲例如:魚烤肉串雞雞肉串,這將影響所有類別而不意識到它。將會出現一些拼寫錯誤,可能需要修改F1sh Kebab,這應該是Fish Kebab(這在表格規範化時非常有用,我會在每個類別中更新項目名稱)。

+0

用「1」代替「蘑菇」與標準化沒有任何關係。 –

+0

@Catcall - 我沒有那樣說?我在問什麼是編輯時的解決方案。想象一下,工作人員將Ham的項目重命名爲Chip - 它將影響所有類別中的所有項目名稱,因爲它已經正常化了..這是員工的致命錯誤。它可能發生。如果他們正在修正拼寫錯誤,那麼這不是一個問題..你理解我的觀點? –

+0

Catcall的觀點是,當您將名稱移出到自己的表格時,嚴格來說,您並未使用規範化。由於名稱是任何用戶可以爲每條記錄分配的名稱,所以沒有理由說明爲什麼一條記錄上的「CHIPS」實際上與另一條記錄上的「CHIPS」相同。除非你建立一個名稱列表作爲自己的實體,並堅持用戶從列表中選擇(例如自動完成),那麼你本身就不是「正常化」。如果您從項目輸入中分離輸入新名稱(並修復拼寫錯誤)的功能,那麼您正在使用規範化。 –

回答

2

我不希望像下拉選擇項目名稱 - 將有成千上萬個不同的項目名稱 - 這將需要大量的時間來找到項目名稱,然後輸入成本。

可以選擇除下拉框外的現有項目。你可以使用自動完成功能,只接受已知的值。我只想說清楚,用戶界面友好的方式來實現你的目標。

至於是否這樣做,這取決於你。如果產品名稱略有不同,這是一個問題嗎?像這樣的小數據完整性問題可以通過批處理作業或類似的問題得到糾正嗎?

根據您的系統設計確定您的數據應該是什麼樣子。在做出決定後,擔心構建用戶界面的最佳方式。正如我所說,無論您的數據結構如何,都有可用的設計UI的方法。

+0

自動完成是一個好主意。我將研究更多數據應該如何看起來像第一。在過去,我有不好的經驗,從每個類別的相同項目名稱中修復拼寫名稱。這花了一段時間手動修復拼寫錯誤。 –

1

我認爲你很樂意使用你當前的設計,因爲你的名字是產品名稱,而不是類別名稱,你可能想要避免重命名單一產品的情況下一次重命名太多。

規範化是一件好事,但您必須根據您的特定需求來衡量它,在這種情況下,我真的不會像上面顯示的那樣添加額外的表item_name_name。

只是我的兩分錢:)

+0

我可以用我目前的設計,但在過去,我有不好的經驗,從每個類別的相同的物品名稱固定拼寫名稱。如我應該是我......這是什麼解決方案? –

0

什麼都應該依賴於被你的表來表示?關鍵是什麼?根據你所說的話,我沒有看到你的第二個設計是如何更加標準化的。

假設第一個設計中的「名稱」的決定因素與第二個中的「item_name_id」的決定因素相同?如果是這樣,那麼將名稱移動到另一個表格將不會影響您的商品表格所符合的正常表格。

用戶界面設計與數據庫設計無關。你不能讓用戶界面驅動數據庫設計,並期待明智的結果。

0

您需要驗證數據並在添加之前檢查它是否存在,以查看它是否爲新值。

$value = $_POST['userSubmittedValue'] 

//make sure you sanitize the variable (never trust user input) 

$query = SELECT item_name_id 
     FROM item_name 
     WHERE name='$value'; 

$result = mysql_query($query); 
$row = mysql_fetch_row($result); 

if(!empty($row)) 
{ 
//add the record with the id from $row['item_name_id'] to items table 
} 
else 
{ 
//this will be a new value so run queries to add the new value to both items and item_name tables 
} 
+0

什麼時候編輯?看到我的問題。 thx –

+0

項目名稱更改將要求輸入字段具有自動完成功能,第二個字段用於新值併發布到更新函數以更新表格。這完全取決於您是否要保留歷史數據值。深入思考您的應用程序將來如何運行將有助於您決定最佳解決方案。嘗試思考所有可能的情況。 – user466764

0

有需要註冊後才能加入項目/數據快速地一種方式。什麼是 解決方案?我在PHP中開發了後端。

用戶界面問題和數據庫結構是不同的問題。對於給定的數據庫結構,通常有幾種用戶友好的方式來呈現和更改數據。數據完整性來自數據庫。用戶界面只需知道在哪裏找到唯一值。程序員決定如何使用這些獨特的值。您可以使用下拉列表,彈出搜索表單,使用自動完成,將用戶鍵入的內容與數組中的元素進行比較,或者查詢數據庫以查看該值是否已存在。

根據您的描述,這聽起來像是您有一個非常快速的方式來添加數據:「工作人員只需選擇一個類別並輸入項目名稱以快速添加數據」。 (用「1」代替「蘑菇」與標準化沒有任何關係。)

此外,編輯項目名稱的解決方案是什麼?工作人員可能會 完全重命名該項目的名稱,例如:魚烤肉串雞肉 烤肉串,這將影響所有類別沒有意識到它。

您已經允許錯誤的人編輯項目名稱。認真。

這種問題出現在每個數據庫應用程序中。只允許經過培訓和值得信賴的人員進行這些更改。 (請參閱您的dbms文檔以獲得GRANT和REVOKE,也可以查看ON UPDATE RESTRICT。)

在我們的生產數據庫中,我可以插入新狀態(適用於美國),並且可以更改現有狀態名稱無論我想要什麼。但如果我將「阿拉巴馬州」改爲「吉爾吉斯斯坦」,我會被解僱。因爲我應該知道比做那樣的東西更好。

但即使我是管理員,我也無法編輯舊金山地址並將其郵政編碼更改爲'71601'。數據庫「知道」'71601'不是舊金山的有效郵政編碼。也許你可以在你的數據庫中添加一兩張表。我無法從你的描述中看出這樣的事情是否會對你有所幫助。

在我不是管理員的系統上,我希望沒有權限將行插入到狀態表中。在其他表中,我可能有權插入行,但不能更新或刪除它們。

將有可能需要修正像F1sh 烤肉應該是魚肉串

的教訓是相同的一些拼寫錯誤。有些人應該被允許更新items.name,有些人不應該。撤銷權限,限制級聯更新,使用更多表提高數據完整性,或增加培訓。