数据库设计,客户(公司/个人)在同一个表中?

时间:2016-01-29 19:38:54

标签: sql database-design relational customer

发现可能重复:Database design, multiple types of customers in the same table

大家好。

我实际上正在寻找一种很好的方式来创建一个包含两种客户的数据库:个人和公司。这是一个网站,我正在使用 CodeIgniter 框架(不确定它是否精确)。

我只会写“重要”字段,以确保更容易理解我正在尝试做什么。

  • 这两类客户都有这些必需的数据:电子邮件(就是这样 登录),密码
  • 对于公司: siret (SIRET号码),名称
  • 对于个人: first_name last_name

所以,我想知道是否最好将所有内容都放在一个表中(根据客户类型使用NULL字段)或者将两个表(公司,个人)与“主”表(帐户)分开

我对单个表的想法

+----------------+--------------------+
|    account     |                    |
+----------------+--------------------+
| id (PK)        |                    |
| email (UNIQUE) |                    |
| password       |                    |
| siret (UNIQUE) | NULL if individual |
| company_name   | NULL if individual |
| first_name     | NULL if company    |
| last_name      | NULL if company    |
| is_company     | necessary ?        |
+----------------+--------------------+

如果 first_name last_name 为空,则为个人
如果 siret company_name 为空,则为公司
或者可以直接使用 is_company 字段?

我对多个表的想法

+----------------+--------------------+--------------------+
|    account     |       company      |     individual     |
+----------------+--------------------+--------------------+
| id (PK)        | account_id (PK/FK) | account_id (PK/FK) |
| email (UNIQUE) | name               | first_name         |
| password       | siret (UNIQUE)     | last_name          |
| is_company ?   |                    |                    |
+----------------+--------------------+--------------------+

此处,在创建新帐户时,它会填充2个表:帐户以及关于客户类型的公司个人
我想在这种情况下我们需要运行2个查询来获取特定客户的每个数据。

我不知道什么是最好的方法,也不知道是否有一种“经常使用的标准”。但我确信我会很高兴得到你的意见。

1 个答案:

答案 0 :(得分:3)

阅读Table Inheritance。单表继承很简单。

create table parties (
  party_id int primary key,
  type text not null, -- use a check constraint or foreign key in real life
  individual_given_name text null,
  individual_surname text null,
  organization_legal_name text null,
  organization_siret text null
);

在上文中,使用检查约束来确保完整性,具体取决于派对类型。

其他类型的政党可以是公司部门,政府机构或个人团体(如家庭)。

“帐户”不是一个很好的术语,因为它在计算中有多种含义。用户可能更好。

create table users (
  user_id int primary key,
  email_address text not null unique,
  password_hash text not null,
  party_id int not null references parties(party_id)
);