簡體   English   中英

簡單數據庫設計問題

[英]Simple Database Design Question

我正在開發支持php和mysql的web應用程序。 我有表名為users的用戶,在此表中我存儲了一些信息,如用戶名,名字和姓氏,電話號碼等。在我的應用程序中,用戶可以輸入一些可選信息,如電子郵件通訊選項,公司名稱(如果有效... )或網站網址。 所有這些信息(應用程序有大約20種可選信息類型)是可選的。 在這種情況下哪種數據庫設計是真的?

可能是我可以將所有額外信息存儲在數組中並使用序列化並保存到數據庫然后在讀取數據時我應該使用unserialize但這種方式有一些缺點。 我在等待你的想法,謝謝。

如果使用php的序列化將額外數據序列化為一列,您將永遠無法查詢該數據。 IE如果要查詢具有“ http://www.foo.com ”等網站的用戶,則無法執行此操作,因為該數據已序列化。

我通常不喜歡在我的數據庫中存儲序列化數據,除非沒有辦法解決它。

為什么要這么做 ?

沒有任何好處:你不能查詢它,它對任何其他不了解它的開發人員來說都很模糊? 等等

最好的辦法是為每個選項信息設置1個字段,並設置“Nullable”。 如果用戶沒有輸入任何內容,則該行包含DBNull

添加一個包含三列的額外表OptionalInformation:

  • FK_UserID
  • OptionalFieldName

三者的組合是此表的主鍵。 查詢比序列化列更容易查詢。

如果您決定稍后存儲更多信息,它也會更容易。 您不必在用戶表中添加額外的列,而是向OptionalInformation表添加一行

我沒有看到沒有將您要捕獲的所有數據作為數據庫中的字段捕獲的任何好處。

如果以某種方式對數據進行序列化,則無法對其進行查詢,那么獲取值將會更加有效,這將使其他人更難理解您的設計。

如果您有單獨的列,那么很容易找到您想要的數據,如果您有一個類似Intellisense的編輯器,它將自動完成列名稱。

您希望從序列化數據中獲得哪些好處? 大多數數據庫對於如何存儲數據非常聰明,因此您不會保存任何磁盤空間,並且無論如何這都不會成為問題。

我只想找一個表 - 用戶,OPTIONAL字段的默認值為NULL。

將這些可選字段添加為多個表字段或單個“可選”字段取決於應用程序的原因,但我會說,如果您確定這些字段都不會以任何方式用於SQL查詢,那么應該是好。

有一點需要注意,我不會使用serialize()而是:

$json = json_encode($data);

$data = json_decode($json, true)

與serialize()不同,json可以在別處(javascript / browser)進行反序列化,是二進制安全的,並且它也是人類可讀的。

我確信在架構設計中有很多方法可以作為單個/通用實體執行此操作。

序列化,鍵值查找表等等......

但只有20列,我會問你是否應該。 讓您的工具和數據庫完成工作並將它們保存為列。 當您想要在將來報告或提取此數據時,您可能會后悔以任何其他方式執行此操作。

序列化可防止您查詢某個特定數據。 絕對你可能想知道誰和所有人都選擇了時事通訊。 然后,您應該將每個信息存儲在單獨的列中。

您可能想對可選列使用NULL值。 但是性能方面,NULL值在索引和排序方面給服務器帶來了壓力。 因此,建議將空字符串或零作為列的默認值。 從PHP中,您可以使用empty()方法檢查狀態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM