[英]How to handle optional fields in MySQL?
我有一個記錄分類列表的MySQL表。 我們不會強制用戶加入以發布商家信息,因此商家信息並不總是與之相關聯的user_id
。
因此,如果他們沒有登錄,我需要一種記錄海報電子郵件的方法。
創建一個有時會空白且有時被填充的列email
是不好的做法嗎?
或者有沒有更好的方法來解決這個問題,我沒有意識到?
創建一個有時會空白且有時被填充的列電子郵件是不好的做法嗎?
這不是一個壞習慣,不:juste使用NULL列 - 這就是為什么它們存在;-)
見12.1.17。 CREATE TABLE語法 :在create table查詢的column_definition部分,您可以指定NULL
或NOT NULL
。
順便說一句:使用NULL,字面意思是“沒有價值”比使用某種“不可能的價值”更好,就像一個空字符串:NULL真的意味着“沒有價值”,並且讓你的觀點顯而易見 - 而空字符串可能意味着代碼中的錯誤。
我真的沒有看到另一種“合乎邏輯”的方式,實際上......
但請注意,您必須在應用程序的代碼中處理電子郵件的NULL值;當然;-)
這正是NULL的用途。 但是你已經知道了,因為你的user_id列有時也會是NULL,對嗎?
我認為你所采用的方法是完全可以接受的。 正如longneck所指出的,那就是SQL數據庫中的NULL。
但是,如果你真的關心它,你可以節省空間(可能是顯著量,取決於列類型和行數),如果你使用的用戶名和電子郵件地址user_id列,然后還有一個布爾列,比如is_email來區分user_id列中存儲的值的類型。 這可能會簡化您的工作,因為在很多地方,您的應用程序可能並不關心數據實際上是user_id還是電子郵件地址。
我有一個記錄分類列表的MySQL表。 我們不會強制用戶加入以發布商家信息,因此商家信息並不總是與之相關聯的user_id。
因此,如果他們沒有登錄,我需要一種記錄海報電子郵件的方法。
您的用戶實體的業務關鍵是什么? 或者,更直接:什么是你的用戶實體? 是否每個不同的電子郵件地址都是用戶實體的密鑰,其中一些用戶已經注冊並且他們的電子郵件設置在某個配置文件中,而其他用戶沒有注冊並且每次發布時都會給出電子郵 或者你有兩個不同的實體,RegisteredUser和UnknownPosterWithEmailAddress,它們的屬性存儲在不同的地方?
在后一種情況下,您將使用NULLable user_id和NULLable電子郵件字段,就像您建議的那樣,但是“對於給定的帖子,查找應該發送回復的電子郵件地址”這樣的查詢將會很尷尬,例如所有帖子的列表及其各自的回復地址將如下所示:
select post.id,
case when post.user_id is not null then user.email
else post.email end as email
from post
left join user on user.id=post.user_id;
一段時間后,這會變得非常混亂。
我寧願使用前一種方法:User中的每一行都是一張dsitinct海報,其中包含一個非NULL的唯一電子郵件地址,以及一個代理鍵作為帖子中的外鍵:
create table user(id integer primary key,
email text not null unique,
is_registered boolean default false);
create table post(id integer primary key,
user_id integer not null references user(id),
content text);
如果未注冊的用戶輸入了電子郵件地址,則在用戶表中查找,並檢索user.id,必要時在用戶中添加新條目。 因此,您可以回答以下問題:對於給定的電子郵件地址,此用戶在過去一周內發布了多少帖子? 通過外鍵字段,無需比較某些NULLable屬性字段中的字符串。
當用戶選擇注冊時,您可以在用戶自己或某個單獨的表中添加注冊數據(再次使用user.id作為外鍵,有些人可能會認為布爾字段is_registered實際上是冗余的)。 增加的好處:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.