【问题标题】:SQL - Create table in SQLSQL - 在 SQL 中创建表
【发布时间】:2011-07-13 11:30:19
【问题描述】:

如果我在正确的轨道上,请指导我。

我正在尝试为Mobile Bill 为个人X 创建数据库架构,以及如何为表Bill_Detail_Lines 定义PKFK

以下是假设:

  1. 每个客户都有一个唯一的关系编号。
  2. Bill_no 将是独一无二的,因为它每个月都会生成。
  3. X 每个月都可以拨打同一个手机号码。
  4. Account_no 与每个手机号码相关联,并且不会改变。

架构:

table: Bill_Headers

Relationship_no    - int, NOT NULL , PK
Bill_no            - int, NOT NULL , PK
Bill_date          - varchar(255), NOT NULL
Bill_charges       - int, NOT NULL

table: Bill_Detail_Lines

Account_no    - int, NOT NULL
Bill_no       - int, NOT NULL , FK
Relationship_no - int, NOT NULL, FK
Phone_no      - int, NOT NULL
Total_charges  - int

table: Customers

Relationship_no    - int, NOT NULL, PK
Customer_name      - varchar(255)
Address_line_1     - varchar(255) 
Address_line_2     - varchar(255) 
Address_line_3     - varchar(255) 
City               - varchar(255)
State              - varchar(255)
Country            - varchar(255)

【问题讨论】:

  • 你的电话号码真的是 int 吗?在德国,即手机号码以 0 开头。为什么您的 bill_date 字段是 varchar?
  • bill_date 应该是日期。我真的对冻结模式很感兴趣,然后在这些领域进行研究。

标签: sql create-table


【解决方案1】:

我建议为Bill_Detail_Lines 设置一个主键。如果每一行代表对给定号码的所有调用的总和,那么自然 PK 似乎是(Relationship_no, Bill_no, Phone_no),或者可能是(Relationship_no, Bill_no, Account_no)

如果每一行都代表一个调用,那么我可能会添加一个Line_no 列并创建PK (Relationship_no, Bill_no, Line_no)

【讨论】:

  • 完美。每条线代表一个号码的总通话费用。我可以让我们Relationship_no, Bill_no, Phone_no or Account_no PK。
【解决方案2】:

是的,就我而言,一切看起来都很好。

【讨论】:

  • bill_detail_lines 包含对不同手机的所有呼叫的摘要,但如果我将 bill_no 和 relationship_no 作为主键,我不能输入多个。
  • 您可以在 bill_detail_lines 表中插入多个条目,因为 bill_no 和 relationship_no 是 FK。在 bill_detail_lines 表中可以重复。
  • 这是否意味着我不需要在 bill_detail_lines 中声明 PK?
  • 声明 PK 完全取决于您的需要。我之前的意思是 FK 不会在重复条目中造成问题。您只需要在派生 FK 的表中具有唯一条目。
【解决方案3】:

我不同意,有几个“标准”没有被遵循。是的,设计看起来不错,但命名约定不合适。

首先,表名应该是单数(很多人会不同意)。

如果你有一个单一的 int, PK 在一个表上,标准是称之为'ID',因此你有“SELECT Customer.ID FROM Customer” - 例如。然后,您还可以完全限定 FK 列,例如:Bill_Headers 上的 CustomerID 而不是 Relationship_no,然后您必须检查表定义以记住它的相关内容。

我也一直牢记在心,就是在不混淆名称的情况下使列标题尽可能清晰和简短。例如,Bill_Headers 上的“Bill_charges”可能只是“Charges”,因为您已经在 Bill_Header(s) 上(

最后,请注意在一个就足够的情况下对多个列进行硬编码,反之亦然。我具体说的是:

Address_line_1 - varchar(255) Address_line_2 - varchar(255) 地址_line_3 - varchar(255)

这会导致以后头疼。 SQL 确实能够在字符串中存储换行符,因此将它们组合到一个“地址 - varchar(8000)”将是最简单的。理想情况下,这将在一个单独的表中,使用 int "CustomerID - int PK FK" 列将其命名为 Customer_Address,您可以在其中输入特定信息。

请记住,这些只是建议,因为没有每个人都应该遵循的单一数据库设计方法。这些是最佳做法,最终由您自己决定。

【讨论】:

    【解决方案4】:

    有几个错误:

    1. Realtionship_no 和 Bill_no 是整数。确保条目在整数范围内。最好把它们当作 varchar() 或 char()

    2. Bill_date 应该是数据类型 Date

    3. 在表 Bill_Detail_Lines 中,最好将 Account_no 设置为 varchar() 或 char(),因为帐号很长。 Phone_no 也是如此。

    您的客户表一切正常,只是您将 varchar() 大小设置为 255 的 City State 和 Country 太大了。您也可以使用更小的尺寸。

    【讨论】:

    • Re 1):拥有一个由两列组成的主键是完全可以的。
    • Re 1) 我会改正的。多列构成主键。
    • @a_horse_with_no_name...我以为他宣布了 2 PK。我的错。我更新了那个。是的,您可以使用多个列...这可能会解决您的目的。
    猜你喜欢
    • 2018-01-18
    • 2012-03-24
    • 2016-05-14
    • 2015-07-11
    • 2018-03-19
    • 1970-01-01
    • 2014-02-05
    • 2013-03-19
    • 2017-11-02
    相关资源
    最近更新 更多