抽象数据库设计。

时间:2015-09-17 22:15:32

标签: mysql database

因此,我正在创建一个包含来自不同国家/地区的不同用户类型的网络应用。用户类型的示例包括companystaff等。公司将拥有company_name字段且员工不会。

users数据库中,我想知道每列实现一个表是否是个好主意,即对于每个用户属性,会有一个带有外键的表,这将是属性值为user_idvalue

例如。 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数据库,其中不同的国家'地址有不同的值。

评论

3 个答案:

答案 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_nameemail列的单个用户表。

对于地址表,我从简单的开头开始:id,address_line_1,address_line_2,city,state,country,zip。

答案 2 :(得分:0)

使用此策略,您将需要执行大量连接表以获得有意义的查询结果。因此,您的性能将受到影响,并且您对存储的使用效率非常低。

您至少应该组合通常为应用程序中的逻辑实体组合的列。因此,如果“公司”与“员工”的不同之处在于它有额外的列,那么您将创建一个表'users.company_properties'。