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

Database design, customers (companies / individuals) in the same table?

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

大家好。

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

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

所以,我想知道是将所有内容放在一个 table 中(根据客户类型使用 NULL 字段)还是分成 2 个 table 更好(公司,个人)与“主人”table(帐户)。


我的单身想法table

+----------------+--------------------+
|    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为空,则为个人.
如果 siretcompany_name 为空,则为 company.
或者直接使用 is_company 字段 ?


我对多个table的想法

+----------------+--------------------+--------------------+
|    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 tables :accountcompany个人关于客户类型。
我想在这种情况下我们需要 运行 2 个查询来获取特定客户的所有数据。

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

继续阅读 Table Inheritance。单一 Table 继承很好也很简单。

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
);

在上面,根据参与方类型使用检查约束来确保完整性。

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

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

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)
);