发现可能重复:Database design, multiple types of customers in the same table
大家好。
我实际上正在寻找一种很好的方式来创建一个包含两种客户的数据库:个人和公司。这是一个网站,我正在使用 CodeIgniter 框架(不确定它是否精确)。
我只会写“重要”字段,以确保更容易理解我正在尝试做什么。
所以,我想知道是否最好将所有内容都放在一个表中(根据客户类型使用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个查询来获取特定客户的每个数据。
我不知道什么是最好的方法,也不知道是否有一种“经常使用的标准”。但我确信我会很高兴得到你的意见。
答案 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)
);