【问题标题】:How to handle a attribute with just two possible values如何处理只有两个可能值的属性
【发布时间】:2014-08-05 17:24:20
【问题描述】:

在我的 Web 应用程序中,我有一个 company,它可以是 buyersupplier 或两者兼而有之。
所以我的数据库表会是这样的

Company( id_company, ..., is_buyer, is_supplier, ... )

或者:

Company( id_company, ... )
Type_company( id_type_company, type )
Extra_table(id_company, id_type_company )

或者:

Company( id_company, ... )
Type_company( id_company, id_type_company, type )

如果可能的话,我希望对每种情况都有一个解释(优点和缺点)。

【问题讨论】:

  • 目前为止的利弊知道多少?
  • 买家和供应商之间有什么区别(除了型号名称)吗?
  • 目前没有区别。
  • 我不懂你@philipxy

标签: sql database database-design database-schema normalization


【解决方案1】:

你可以考虑使用像这样的通用超类型

CREATE TABLE companies
(
  id int not null primary key, 
  name varchar(128)
  -- other columns
);
CREATE TABLE buyers
(
  company_id int not null primary key,
  foreign key (company_id) references companies (id)  
);
CREATE TABLE suppliers
(
  company_id int not null primary key,
  foreign key (company_id) references companies (id)
);

以下是一些示例查询:

-- Select all buyers
SELECT c.id, c.name
  FROM companies c JOIN buyers b 
    ON c.id = b.company_id;

-- Select all suppliers
SELECT c.id, c.name
  FROM companies c JOIN suppliers s 
    ON c.id = s.company_id;

-- Select companies that are both buers and suppliers
SELECT c.id, c.name
  FROM companies c JOIN buyers b 
    ON c.id = b.company_id JOIN suppliers s 
    ON c.id = s.company_id;

-- Select companies that are buers BUT NOT suppliers
SELECT c.id, c.name
  FROM companies c JOIN buyers b 
    ON c.id = b.company_id LEFT JOIN suppliers s 
    ON c.id = s.company_id
 WHERE s.company_id IS NULL; 

这里是SQLFiddle演示

推荐阅读:

【讨论】:

  • 感谢这个好答案,但你能更新它并告诉我为什么你的解决方案比我在我的问题中写的 3 个可能的解决方案更好吗?
  • @Youssef 不客气 :) 在提出的三种方法中,我只考虑第一种(如果有的话)。如果您不希望有一天也有必要实施类似is_vendor 的东西,您可以侥幸成功。
  • @Youssef 现在我提出的解决方案是一种通用模式,并且干净、自描述、可扩展(例如,您可以轻松实现 is_vendor),强制执行外键并进行规范化。
  • 是的,我看到你的解决方案是最好的,只是我害怕创建更多的表格并浪费空间和性能......如果有一天我也必须实施 is_vendor 所以我只是将其添加为company 表中的属性...如果我错了请纠正我
  • 建议的解决方案很可能会减少浪费,因为它是标准化的(在这种情况下并不重要),而不是在一个表中使用标志,并且可能会更快,具体取决于您的索引(索引)的选择性必须在您的标志列上。根据您的代码的编写方式,更改表架构(添加新列)可能会破坏您的代码。但话又说回来,您使用标志列的方法是可行的,对于简单的场景可能已经足够了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-05
  • 1970-01-01
  • 1970-01-01
  • 2013-05-15
  • 2019-08-17
  • 1970-01-01
相关资源
最近更新 更多