用于管理地址的数据库架构

Database schema for managing addresses

我正在使用 sql 服务器开发 MVC 项目。其中每个用户在注册后都会获得一个用户名。注册是使用地址和电子邮件号码以及 phone 号码等各种数据完成的。我正在使用 table 来存储地址,它的 ID 存储在用户 table 中。现在人们可以更改地址,所以我无法理解如何管理它。我想为新用户保留旧地址和新地址。有人可以帮忙吗?

您有一些选择:

在地址 table 中,添加用户 ID 列。在用户 table 中,添加 addressid 列。

用户table会告诉您用户指定的当前地址。

select * from user u
inner join address a on u.userid = a.userid and u.addressid = a.addressid
where userid = 45

地址 table 会告诉您用户使用过的所有地址。

select * from address where userid = 45

优点是用户 table 将您指向最近的地址 table。当用户添加新地址时,地址 table 得到一个插入,用户 table 被更新。缺点是地址 table 中的用户 ID 重复 - 如果 parents 和 children 具有相同的地址(假设每个人都是用户),您将多次添加相同的地址每个用户。要获取当前地址,您必须同时询问用户和地址 tables.

在地址table中,添加userid列和isPrimary bit列。在用户 table 中不要添加 addressid 列

用户 table 不会告诉您有关地址的任何信息,但地址 table 会告诉您用户使用过的所有地址以及哪个是他们的主要地址。

select * from user u
inner join address a on u.userid = a.userid and a.isPrimary = 1
where userid = 45

您可以直接从地址 table 获取给定用户的当前地址。

select * from address where userid = 45 and isPrimary = 1

地址table,就像前面的例子一样,会告诉你用户使用过的所有地址。

优点只是地址 table 负责告诉您该地址属于谁以及它是否是主地址。

将用户存储在用户table,地址存储在地址table。创建联结点 table 以将地址和用户聚集在一起

可以创建具有 userid、addressid、isPrimary 列的 UserAddress table。 User table 将只包含用户信息。地址 table 将有地址,要知道哪个地址属于哪个用户,您可以询问 UserAddress table.

select * from user u
inner join useraddress ua on u.userid = ua.userid and ua.isPrimary = 1
inner join address a on ua.addressid = a.addressid
where u.userid = 45

这样做的好处是将一个地址关联到多个人。居住在同一家庭的 Parents 和 2 children 可以关联到同一地址。如果家庭搬到另一个地方,您在地址 table 中有一个额外的记录,在交叉点 table 中有 4 个记录。缺点是多了一个join。

选择您认为适合您情况的用例。