Sql server 用于管理地址的数据库模式

Sql server 用于管理地址的数据库模式,sql-server,database-design,asp.net-mvc-5,foreign-key-relationship,Sql Server,Database Design,Asp.net Mvc 5,Foreign Key Relationship,我正在用SQLServer开发一个MVC项目。其中每个用户在注册后都将获得一个用户名。注册是使用各种数据完成的,如地址、电子邮件号码和电话号码。我使用一个表来存储地址,它的id存储在users表中。现在,由于人们可以更改地址,所以我无法理解如何管理它。我想为新用户保留旧地址和新地址。有人能帮忙吗?您有一些选择: 在地址表中,添加userid列。在用户表中,添加addressid列。 用户表将告诉您用户指示的当前地址 select * from user u inner join address

我正在用SQLServer开发一个MVC项目。其中每个用户在注册后都将获得一个用户名。注册是使用各种数据完成的,如地址、电子邮件号码和电话号码。我使用一个表来存储地址,它的id存储在users表中。现在,由于人们可以更改地址,所以我无法理解如何管理它。我想为新用户保留旧地址和新地址。有人能帮忙吗?

您有一些选择:

在地址表中,添加userid列。在用户表中,添加addressid列。

用户表将告诉您用户指示的当前地址

select * from user u
inner join address a on u.userid = a.userid and u.addressid = a.addressid
where userid = 45
地址表将告诉您用户使用过的所有地址

select * from address where userid = 45
优点是用户表将您指向最近的地址表。当用户添加新地址时,地址表将获得一个insert并更新用户表。缺点是在地址表中重复使用userid——如果父母和孩子拥有相同的地址(假设每个人都是用户),那么您将为每个用户多次添加相同的地址。要获取当前地址,您必须同时询问用户表和地址表

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

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

select * from user u
inner join address a on u.userid = a.userid and a.isPrimary = 1
where userid = 45
您可以直接从地址表中获取给定用户的当前地址

select * from address where userid = 45 and isPrimary = 1
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
地址表,就像前面的示例一样,将告诉您用户使用过的所有地址

select * from address where userid = 45
优点在于地址表负责告诉您该地址属于谁以及它是否是主地址

在用户表中存储用户,在地址表中存储地址。创建连接表以将地址和用户聚集在一起

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

select * from address where userid = 45 and isPrimary = 1
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
这样做的好处是将一个地址与多个人关联。居住在同一家庭中的父母和2名子女可以与同一地址关联。若住户迁移到另一个位置,地址表中会有一条额外记录,连接表中会有4条记录。缺点是额外的连接

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