如何处理MySQL中的可选字段?

时间:2009-09-09 16:51:18

标签: mysql

我有一个记录分类列表的MySQL表。我们不会强制用户加入以发布商家信息,因此商家信息不会始终与user_id相关联。

因此,如果他们没有登录,我需要一种记录海报电子邮件的方法。

创建有时空白且有时会被填充的列email是不好的做法吗?

或者有没有更好的方法来解决这个问题,我没有意识到?

4 个答案:

答案 0 :(得分:6)

  

创建列是不好的做法   电子邮件,有时会是空白的   有时被填补?

这不是一个坏习惯,不是:juste使用NULL列 - 这就是为什么它们存在;-)
请参阅12.1.17. CREATE TABLE Syntax:在create table查询的 column_definition 部分,您可以指定NULLNOT NULL

顺便说一句:使用NULL,字面意思是“没有价值”比使用某种“不可能的价值”更好,就像一个空字符串:NULL真的意味着“没有价值”,并且让你的观点显而易见 - 而空字符串可能意味着代码中出现错误。

我并没有真正看到另一种“合乎逻辑”的方式,实际上......

但请注意,您必须在应用程序的代码中处理电子邮件的NULL值; - )

答案 1 :(得分:2)

这正是NULL的用途。但是你已经知道了,因为你的user_id列有时也会是NULL,对吗?

答案 2 :(得分:1)

我认为你所采用的方法是完全可以接受的。正如longneck指出的那样,那就是SQL数据库中的NULL。

但是,如果您真正关心它,如果对用户标识使用 user_id 列,则可以节省空间(可能需要很大的数量,具体取决于列类型和行数) 电子邮件地址,然后使用另一个布尔列,例如 is_email ,以区分 user_id <中存储的值的类型/ em>列。这可能会简化您的工作,因为在很多地方,您的应用程序可能并不关心数据实际上是user_id还是电子邮件地址。

答案 3 :(得分:1)

  

我有一个记录分类列表的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实际上是冗余的)。增加的好处:

  • 如果他之前在同一个电子邮件地址发布过,那么现在他所有的旧帖子都会自动与他的新注册身份相关联。
  • 如果用户在其个人资料中更改了自己的电子邮件地址,则所有对其旧帖子的回复都会“看到”新更新的电子邮件地址。