簡體   English   中英

如何處理MySQL中的可選字段?

[英]How to handle optional fields in MySQL?

我有一個記錄分類列表的MySQL表。 我們不會強制用戶加入以發布商家信息,因此商家信息並不總是與之相關聯的user_id

因此,如果他們沒有登錄,我需要一種記錄海報電子郵件的方法。

創建一個有時會空白且有時被填充的列email是不好的做法嗎?

或者有沒有更好的方法來解決這個問題,我沒有意識到?

創建一個有時會空白且有時被填充的列電子郵件是不好的做法嗎?

這不是一個壞習慣,不:juste使用NULL列 - 這就是為什么它們存在;-)
12.1.17。 CREATE TABLE語法 :在create table查詢的column_definition部分,您可以指定NULLNOT 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.

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