因此,我正在创建一个包含来自不同国家/地区的不同用户类型的网络应用。用户类型的示例包括company
,staff
等。公司将拥有company_name
字段且员工不会。
在users
数据库中,我想知道每列实现一个表是否是个好主意,即对于每个用户属性,会有一个带有外键的表,这将是属性值为user_id
和value
。
例如。
users.company_name =
id(PK), | user_id(FK) | 'company_name'
1 | 1 | company 1
users.email =
id(PK), | user_id(FK) | 'email'
1 | 1 | user@email.com
同样可以应用于address
数据库,其中不同的国家'地址有不同的值。
评论
答案 0 :(得分:1)
您正在寻找的术语是" The Party Model"
您希望使用表继承†(也称为subtype/supertype)关系来模拟这样的内容。
个人是抽象法律党的具体化。组织(例如公司)也是抽象法律方的具体化。
"工作人员"不是法律方的子类型。它是公司与个人之间的关系。一家公司有很多员工与个人的关系。
我推荐Single Table Inheritance,因为它快速而简单。如果您真的不喜欢空值,请转到Class Table Inheritance。
create table parties (
party_id int primary key,
type smallint not null references party_types(party_type_id), --elided,
individual_name text null,
company_name text null,
/* use check constraints for type vs individual/company values */
);
如果您要使用单表继承,我会使用PostgreSQL而不是MySQL(或MariaDB),因为后者不支持检查约束。
您可以将user
归属于party
,或者将一方加入user
。
†与PostgreSQL的继承功能不同。
答案 1 :(得分:0)
我创建了一个包含company_name
和email
列的单个用户表。
对于地址表,我从简单的开头开始:id,address_line_1,address_line_2,city,state,country,zip。
答案 2 :(得分:0)
使用此策略,您将需要执行大量连接表以获得有意义的查询结果。因此,您的性能将受到影响,并且您对存储的使用效率非常低。
您至少应该组合通常为应用程序中的逻辑实体组合的列。因此,如果“公司”与“员工”的不同之处在于它有额外的列,那么您将创建一个表'users.company_properties'。