繁体   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