3

发现可能重复:数据库设计,同一张表有多种类型的客户

大家好。

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

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

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

所以,我想知道是否最好将所有内容都放在一个表中(根据客户类型使用 NULL 字段),还是在带有“主”表(帐户)的 2 个表(公司、个人)之间拆分更好。


我对一张桌子的想法

+----------------+--------------------+
|    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_namelast_name为 null,则它是一个individual
如果siretcompany_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 个查询来获取特定客户的每个数据。

我不知道什么是最好的方法,也不知道是否有一种“经常使用的标准”。但我可以肯定的是,如果能得到您的意见,我将不胜感激。

4

1 回答 1

4

阅读表继承。单表继承很好也很简单。

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)
);
于 2016-01-29T20:13:29.250 回答