Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database design 两个不同级别的表中的唯一用户名。合适的数据库设计?_Database Design_Relational Database_Database Schema - Fatal编程技术网

Database design 两个不同级别的表中的唯一用户名。合适的数据库设计?

Database design 两个不同级别的表中的唯一用户名。合适的数据库设计?,database-design,relational-database,database-schema,Database Design,Relational Database,Database Schema,我有一张供应商的桌子。此表包含名称、用户名和密码哈希等内容 有时一个供应商只有一个人,在这种情况下,这样做很好。但有时一个供应商是一家公司,在这种情况下,可能需要多个员工登录。到目前为止,所有供应商员工都为每个供应商共享一个用户名/密码。现在我想给每个人个人的证书 我已经有了一个包含供应商联系人的表,所以在该表中添加两列用户名和密码哈希最简单。但是,由于我希望在一个人供应商的供应商表中保留用户名和密码哈希的选项,因此我无法为用户名创建唯一索引,因为它们分布在两个表中 我当然可以在PHP中强制使用

我有一张供应商的桌子。此表包含名称、用户名和密码哈希等内容

有时一个供应商只有一个人,在这种情况下,这样做很好。但有时一个供应商是一家公司,在这种情况下,可能需要多个员工登录。到目前为止,所有供应商员工都为每个供应商共享一个用户名/密码。现在我想给每个人个人的证书

我已经有了一个包含供应商联系人的表,所以在该表中添加两列用户名和密码哈希最简单。但是,由于我希望在一个人供应商的供应商表中保留用户名和密码哈希的选项,因此我无法为用户名创建唯一索引,因为它们分布在两个表中


我当然可以在PHP中强制使用唯一的用户名,但我想知道我是否犯了数据库设计错误。我曾考虑创建一个新的“users”表来放入所有凭据,但不知何故,它感觉不太对劲。有什么提示吗?

这是创建第二个表的好例子

考虑下表结构:

Suppliers: SupplierId, Name, Address, etc..
SupplierLogins: SupplierLoginId, SupplierId, Username, Password
您可以使用此结构添加单个登录或多个登录。您的唯一组合可能位于供应商ID、用户名组合上。依我看,电子邮件ID是一个很好的登录方式——它不需要记住用户名


此外,例如,如果Joel@Superuser.com换了工作,去了另一家供应商,他就变成了Joel@AskDifferent.com,因此您不必丢失旧登录下所有内容的数据。

这是创建第二个表的好例子

考虑下表结构:

Suppliers: SupplierId, Name, Address, etc..
SupplierLogins: SupplierLoginId, SupplierId, Username, Password
您可以使用此结构添加单个登录或多个登录。您的唯一组合可能位于供应商ID、用户名组合上。依我看,电子邮件ID是一个很好的登录方式——它不需要记住用户名


此外,例如,如果Joel@Superuser.com换了工作,去了另一家供应商,他就变成了Joel@AskDifferent.com,因此您不必丢失旧登录下所有内容的数据。

这是创建第二个表的好例子

考虑下表结构:

Suppliers: SupplierId, Name, Address, etc..
SupplierLogins: SupplierLoginId, SupplierId, Username, Password
您可以使用此结构添加单个登录或多个登录。您的唯一组合可能位于供应商ID、用户名组合上。依我看,电子邮件ID是一个很好的登录方式——它不需要记住用户名


此外,例如,如果Joel@Superuser.com换了工作,去了另一家供应商,他就变成了Joel@AskDifferent.com,因此您不必丢失旧登录下所有内容的数据。

这是创建第二个表的好例子

考虑下表结构:

Suppliers: SupplierId, Name, Address, etc..
SupplierLogins: SupplierLoginId, SupplierId, Username, Password
您可以使用此结构添加单个登录或多个登录。您的唯一组合可能位于供应商ID、用户名组合上。依我看,电子邮件ID是一个很好的登录方式——它不需要记住用户名


此外,例如,如果Joel@Superuser.com换了工作,去了另一家供应商,他就变成了Joel@AskDifferent.com,这样您就不必丢失旧登录名下所有内容的数据。

我会将所有登录名都放在联系人表中,即使只有一个登录名的供应商也是如此。您仍然需要供应商的一个登录名的联系信息,请将所有类似信息放在一个表中。

我会将所有登录名放在联系表中,即使只有一个登录名的供应商也是如此。您仍然需要供应商的一个登录名的联系信息,请将所有类似信息放在一个表中。

我会将所有登录名放在联系表中,即使只有一个登录名的供应商也是如此。您仍然需要供应商的一个登录名的联系信息,请将所有类似信息放在一个表中。

我会将所有登录名放在联系表中,即使只有一个登录名的供应商也是如此。您仍然需要供应商的一次登录的联系信息,将所有类似信息放在一个表中。

我认为David Aldridge和Ray More都为您提供了潜在的合适的设计建议,但我想更全面地回答您的问题,并专注于您的陈述,“[您]想知道[您]犯了一个数据库设计错误。”


简短版本:是的,我认为您犯了一个设计错误——坚持将单人供应商登录详细信息放在供应商表中——这导致您拒绝自己的备选方案和其他人的建议

长版本:首先,从概念上而不是技术上考虑这个问题。登录详细信息属于谁?过去,它们属于供应商。现在,它们属于供应商员工

数据建模过程的早期阶段(即在创建物理模型之前),我们谈论的是属性而不是列,实体而不是表-因此登录详细信息是供应商员工实体的属性而不是供应商实体的属性。这意味着当您达到物理数据库设计时,这些列应该位于(或与)SupplierContact表中

那么,为什么登录总是属于供应商员工而不是供应商?请考虑以下情况:

您与一个只有一名员工的供应商合作,因此创建 一组他们的登录详细信息。一年后,供应商的 业务扩展,运营人员雇佣了一名助手——他们 还需要访问权限,因此您需要为 同一个供应商

使用您建议的模型,您需要从Supplier表中删除当前登录详细信息,并向SupplierContact添加两组详细信息