正确的数据库设计/关系

时间:2018-02-25 17:44:23

标签: sql sql-server database-design

下面我展示了我建议的数据库表的基本示例。

我有两个问题:

  1. 类别" 工程"," 客户"和" 供应商"将具有完全相同的" 学科"," DocType1 "和" DocType2",这是否意味着我必须在" 分类"中输入这3次。表,还是有更好的方法?请记住,有" 供应商" 分类表中也包含的类别。

  2. 在" 文件"我已经展示过" category_id "和" classification_id ",我不确定这将取决于第一个问题的答案,但是" category_id "必要的,或者我应该只使用JOIN来允许我根据 classification_id 过滤类别?

  3. 提前谢谢。

    表格 类别

    id | name        
    ---|-------------
    1  | Engineering 
    2  | Client      
    3  | Vendor      
    4  | Commercial  
    

    表格 纪律

    id | name        
    ---|-------------
    1  | Electrical
    2  | Instrumentation      
    3  | Proposals
    

    表格 DocType1

    id | name        
    ---|-------------
    1  | Specifications
    2  | Drawings      
    3  | Lists  
    4  | Tendering
    

    表格 分类

    id | category_id | discipline_id | doctype1_id | doctype2 
    ---|-------------|---------------|-------------|----------
    1  | 1           | 1             | 2           | 00        
    2  | 1           | 1             | 2           | 01        
    3  | 2           | 1             | 2           | 00     
    4  | 4           | 3             | 4           | 00        
    

    表: 文档

    id |      title      | doc_number | category_id | classification_id 
    ---|-----------------|------------|-------------|-------------------
    1  | Electrical Spec | 0001       | 1           | 1
    2  | Electrical Spec | 0002       | 2           | 3
    3  | Quotation       | 0003       | 3           | 4
    

    Table Relationship

1 个答案:

答案 0 :(得分:2)

根据您提供的内容,我们看起来有三个简单的查找表:category,discipline和doctype1。对我来说不直观的部分可能也会引起混淆,因为最后两个表都用作查找表的交叉引用。特别是分类表看起来可能不合适。如果只有某些类别,规则和doctype的组合有效,那么分类表是有意义的,正确的做法是通过文档表中的分类ID查找有效组合。如果不是这种情况,那么您可能只想直接从文档表中引用类别,规则和文档类型。

在您的示例中,文档表具有对分类表的引用和对类别表的引用这一事实说明需要进行此区分。但是,在分类表中查找的行也引用了类别ID。这不仅是多余的,而且还为可能存在冲突的类别ID打开了大门。

我希望这会有所帮助。