我正在开始一个爱好项目的工作,该项目只保留联系信息列表。大量的教程,但我正在寻找基于个人的联系人列表。因此,当有人使用提供的简单登录登录时,该用户将只看到与他/她关联的联系人。稍后我想添加OAuth,但那是另一天。
如何将相关联系信息与特定登录信息联系起来?
我的数据模型如下所示:
namespace ContactManager.Models
{
public class Contact
{
public int ContactId { get; set; }
public string Name { get; set; }
public string Address { get; set; }
public string City { get; set; }
public string State { get; set; }
public string Zip { get; set; }
[DataType(DataType.EmailAddress)]
public string Email { get; set; }
}
}
首先,我想到了一个将用户与之关联的列。类似于将用户的电子邮件存储在列中,其中每个联系人信息属于每个用户。但这似乎很麻烦。
然后我考虑为每个用户准备一张桌子。这使得数据库更清洁,但是如果有很多用户的话会有很多表。我并不期待很多用户,我宁愿选择“正确”的方式而不是假设用户很少的黑客。
同样,我如何将每个用户的联系信息分开,以便我可以显示每个用户的相关信息?
干杯!
P.S。我按照this教程开始,并使其工作到我需要的扩展。 (例如,没有OAuth登录)
答案 0 :(得分:1)
您需要一个User
表和一个UserContact
表。假设SQL Server:
CREATE TABLE dbo.User (
UserId int identity(1,1) NOT NULL CONSTRAINT PK_User PRIMARY KEY CLUSTERED,
Name varchar(50) NOT NULL CONSTRAINT UQ_User_Name UNIQUE,
EmailAddress varchar(254)
);
CREATE TABLE UserContact (
// Do NOT add a surrogate key to this table. No identity column!
UserId int NOT NULL
CONSTRAINT FK_UserContact_UserId FOREIGN KEY REFERENCES dbo.User(UserId),
ContactId int NOT NULL
CONSTRAINT FK_UserContact_ContactId FOREIGN KEY REFERENCES dbo.Contact(ContactId),
CONSTRAINT PK_UserContact PRIMARY KEY CLUSTERED (UserId, ContactId)
);
然后,通过在相应实体的ID(称为多对多连接表)中将行放入此中间表,将用户链接到联系人。
需要考虑的另一件事是用户自己有联系信息。所以你可以考虑这样做:
CREATE TABLE dbo.User (
UserId int NOT NULL
CONSTRAINT FK_User_UserId_ContactId FOREIGN KEY REFERENCE dbo.Contact(ContactId),
CONSTRAINT PK_User PRIMARY KEY CLUSTERED
);
这意味着在任何人都可以成为用户之前,必须首先将他们的信息作为联系人输入。然后,将ContactId
作为UserId
插入到用户表中。最后,您使用与此新UserContact
表相同的外键的User
表。通过这种方式,您可以确保只有在系统中标记为用户的人才能与联系人关联。您可能不希望能够将任何联系人与任何其他联系人联系起来 - 绝大多数联系人都不会登录您的系统。
我坦率地认为后一种想法是一个更好的方案。它被称为“超类型/子类型”模式,非常类似于结构化编程中的继承,其中Contact
也可以是User
,User
类继承自Contact
。 1}}类。您甚至可以在代码中使这种继承的工作方式完全相同!
public class User : Contact {
}
var contact = GetSomeContact();
var user = contact as User;
if (user != null) {
// This is a user! Do some special handling
}
您也可以考虑让它们都继承自Party
类(尽管可能维护“User是Contact的子类”关系)。如果您将公司和组织放入您的联系人数据库,它们也将是Party
类的子类。有关更多提示,请参阅A Universal Person and Organization Data Model。
<强>更新强>
鉴于您使用预先存在的dbo.AspNetUsers
表的新信息,您可以修改该表,使其功能类似于我上面建议的第二个User
表,或者您可以省略新的User
表,并按原样使用AspNetUsers
表,指向它的多对多连接表,而不是我最初建议的User
。