2013-03-03 30 views
3

我正在爲我的BSc項目編寫相當大的Web應用程序,並使用MySQL將它寫入PHP。應該在數據庫級別處理唯一字段的驗證嗎?

創建SQL表時應該使用唯一字段嗎?我問這個的原因是因爲我正在將驗證方法寫入我的PHP。例如,如果我想檢查電子郵件地址是否已經存在於數據庫中,我會首先創建一條SQL語句,查看是否有任何電子郵件地址被返回,然後將初始SQL數據插入到數據庫中。

如果我只是插入初始SQL數據,它會在整個語句中引發錯誤,因爲電子郵件地址必須是唯一的。

這是接近驗證的正確方法嗎?

+0

一個OPTI on就是使它獨一無二,然後在插入時捕獲錯誤,這會告訴你它是重複的,這樣可以節省添加select和insert的工作 - 消除一個db querry – 2013-03-03 19:25:14

+2

在細木工工藝中 - 你永遠不會留下榫眼和榫頭連接脫膠。您將列定義爲唯一的以維護數據完整性。認爲應用程序層將保持一致是您可以犯的更糟糕的錯誤之一。 永遠不要忽略你的數據完整性。 – Trent 2013-03-03 19:25:47

+0

你提到了MySQL。也許你不能考慮PostgreSQL而不是MySQL。我們在Web開發(Apache + PHP + PostgreSQL)中使用PostgreSQL多年,因爲它具有服務器端編程和數據一致性的功能。我確信PostgreSQL最好的選擇(如果你不是固定到MySQL)。 – Artegon 2013-03-03 19:39:23

回答

1

呃...這是兩個完全不同的東西。通過在數據庫的列上設置限制(如唯一),可以防止將錯誤的數據集插入到數據庫中。這是確保數據一致性的基本要素。通過嚮應用程序添加驗證,您可以添加其他圖層。在防止將錯誤數據集插入數據庫的同時,您主要會創建一些方法來告訴用戶他做錯了什麼。

你需要這兩個。一般來說,唯一的約束不應該是唯一關心數據庫的事情。建議也使用外鍵約束和適用更復雜的數據驗證(自定義約束)。然而,因爲你使用的MySQL並不是很多,所以你真的可以得到它

只要儘可能多地去找,因爲最終它會防止很多頭痛,試圖找出爲什麼一個特定的錯誤直到你最終意識到數據庫中的數據是錯誤的。這真的很痛苦。

+0

謝謝。這個答案對我來說很有意義。向用戶解釋說沒有添加條目是我問這個問題的主要原因之一。 – 2013-03-03 23:34:12

1

我不建議這樣做,因爲只有數據庫的約束可以保證你的唯一性

如果有2個請求並行運行,兩個請求可以接受相同的電子郵件地址,並且您有2個用戶具有相同的電子郵件地址。

另外,可能你會對數據庫做一個搜索過濾,所以在MySQL中你想要在電子郵件上有一個索引。所以,這個專欄的獨特之處沒有太大的區別。

0

是的,數據庫應該檢查數據是否正確。無論數據如何到達,數據庫都會保存數據有時候也許你會使用另一個應用程序的數據庫,並且這個應用程序也需要驗證數據。檢查數據在應用程序(前端和後端)和數據庫級別是否正確更安全。

0

通常情況下,這是一個代碼爲應該是的情況。這是Dijkstra's "Separation of Concerns"的一個例子。

由於製作領域的獨特意味着你:

Don't need to write validation code, ergo ultimately you write less code

The validation for values in the database, is in a logical place; bound to the database!

這是數據建模的問題。簡單地問自己這個問題:「這個代碼是合理的?」。在我看來,在數據庫中使用Unique值是正確的選擇。它將驗證從PHP代碼中抽象出來,並且意味着您可以在不更改任何核心模型邏輯的情況下對其進行更改。

0

驗證應執行客戶端(例如JavaScript),因爲它通常會提供更好的用戶體驗。它應該用於服務器端,因爲客戶端可以被繞過。並且應該在數據庫上執行,因爲任何在數據庫上未執行的約束都不是約束......這只是一個建議。

-2

然後有一天,您決定從MySQL切換到其他數據庫,並且您的所有「驗證」不再存在(例如,切換到像MongoDB這樣的數據庫)。

請不要這樣做 - 在應用程序級別執行此操作。它很簡單,版本控制,可測試等。

通過一切手段 - 在MySQL中創建您的唯一索引,但我不會僅依靠這一點。

0

創建場上UNIQUE約束電子郵件地址,是因爲它的最好的方法高選擇性,但可以肯定,你還設置現場NOT NULL

我發現,使用約束會是好多了,但你也可以通過查詢做,比如:

SELECT COUNT(*) FROM table WHERE email = '$email' 

更多關於這個問題:mysql 5.0 indexes - Unique vs Non Unique

+0

在這種情況下,UNIQUE約束不是很好的解決方案。您在刪除此帳戶時做了什麼,但是a)您需要將歷史記錄與此帳戶相關聯,並且b)您希望允許使用此電子郵件地址重新註冊? – Artegon 2013-03-03 19:47:55

+0

不錯,它是真實的,儘管你可以像在硬盤上的索引一樣更新數據庫,並添加一個釋放用戶名可用性的-disabled符號,但保留備份記錄。但在上下文中,電子郵件應該只屬於一個人,(高選擇性) – kingdomcreation 2013-03-03 19:51:31

相關問題