更好的数据库设计,适合企业帐户的通用字段

时间:2018-10-16 09:39:32

标签: sql database database-design

我正在寻求一些建议,以更好地设计商业帐户通用字段的数据库。

至少目前,我们的企业帐户分为两种类型:供应商和零售商。

所以我将表设计为

table: company
- id
- company_name
- company_address
- some other common fields

table: supplier
- id
- company_id
- additional custom fields for supplier

table: retailer
- id
- company_id
- additional custom fields for retailers

这是一个好的设计吗?还是我不应该有一个共同的公司表,而是将这些共同的字段分配给供应商和零售商?

2 个答案:

答案 0 :(得分:0)

尽管您的解决方案需要节省的磁盘空间最少,但实际上我更喜欢一个包含所有3种类型的字段的表:“普通”,“供应商”和“零售商”。原因如下:

  1. 您将需要编写更少的联接
  2. 尽管(1),该设计也不会破坏常规形式。的确,将来您可能会拥有一家同时将成为供应商和零售商的公司
  3. 如果实现3个表,则联接迟早会遇到多态关联的问题(对此进行搜索)

答案 1 :(得分:0)

我同意您的建议,您可能应该只有一个company表。您可以添加一列公司的类型(例如供应商或零售商):

table: company
- id
- company_name
- company_address
- company_type
- some other common fields

company_type字段本身可能是另一个表的ID,该表存储该类型的实际名称以及其他一些元数据。

如果供应商和零售商的性质使得他们需要完全不同的信息列,那么一种可能性就是拥有一个company_metadata表:

table: company_metadata
- company_id
- key
- value

以下是此表的示例:

company_id | key             | value
1          | supplier_origin | Brazil
1          | wholesale       | true
2          | retailer_owner  | false

使用数据透视查询,您可以尝试查找想要的给定公司的任何键。

SELECT MAX(CASE WHEN key = 'supplier_origin' THEN value END) AS supplier_origin
FROM company_metadata
GROUP BY company_id;

如果找不到,就不存在。这种键值方法解决了可能的问题,即仅向company表添加更多列就无法很好地扩展。