纠正MySQL结构以存储基于用户的数据

时间:2015-08-25 20:21:35

标签: php mysql database design-patterns database-design

所以我有一个问题,我希望它不太主观。

我有一个博客风格的网站,所以在主页上的文章与发布日期,发布它的用户等等一起加载。基本数据是这样的。

我将它存储在MySQL中,如下所示:

article_id     username      date                     content          etc.
1              user1         2015-05-14 01:35:14      my content a  
2              user2         2015-05-16 02:33:15      my content b

这样,我可以使用一个查询显示它,在那里我检索用户名,日期,内容等。

我的问题是。我想允许用户选择更改用户名。我看到了两种选择。

我可以像现在一样继续存储数据,并使用用户相关数据手动将这样的表更新为新用户名。或者我按user_id而不是username存储数据,并为每个加载的文章添加额外查询以从另一个user表中获取关联的用户名。

哪种方法正确?

我问这个因为我认为这种情况的推荐做法是什么?通过用户名存储数据并更新它是正常的,或者通过id存储以避免必须这样做 - 但是以查询数据时的开销为代价。我猜测只能在一个查询中显示基于身份的数据的用户名,但这还需要更长的时间?

5 个答案:

答案 0 :(得分:1)

取决于。如果是的话,您是否看到与Article:User存在 1:1 关系,那么存储在单个表中可能就足够了,但通常用户会发布多篇文章,使其成为{{{ 1}}关系,在这种情况下,您应该为1:*创建一个单独的表,并在UserDetailsd表中将user_id设为FOREIGN KEY

答案 1 :(得分:0)

您应该创建一个users表,存储user_id,它将是incremental和user_name。在应用程序中显示用户名时,请加入users表并显示该表中的名称,它始终是最新的。如果您希望允许更改用户名,这是最佳做法。更新所有用户名,不建议使用文章表。这还允许您存储其他与用户相关的信息,如电子邮件,加入日期等,而无需将所有内容保留在文章表中。

答案 2 :(得分:0)

创建一个包含所有用户相关信息的单独表格并更改当前表格,因此仅包含与内容和文章相关的内容。这就是我建议你

的原因

答案 3 :(得分:0)

users创建一个单独的表格,如:

-------------------
user_id | user_name
-------------------

user_id应该是PK

另一张桌子,让我们说文章应该是这样的:

-----------------------------------------------
arcticle_id | date |  content |  etc. | user_id
-----------------------------------------------

其中article_id可以是PKuser_id可以是来自FK表的users,可以建立一种可以在其他表格中使用的关系好。

答案 4 :(得分:0)

您可以为用户创建表,并在字段用户名上使用外键,指定更新时的行为。是这样的:

alter table posts add constraint fk_post_user foreign key (username) references users (name) on update cascade;

这样,当您更新表用户的行时,表帖子上的所有用户名也将更新。