对桥梁实体感到困惑&多属性实体

时间:2018-05-15 01:12:11

标签: mysql sql database create-table

我只是有一些我很困惑的问题。我无法让我的图表出现在这篇文章中,所以我不得不创建一个"文本"版本。

Entity: customers
    Attributes: 
                cus_id -- primary key
                cus_fname -- multi-attribute (name)
                cus_lname -- multi-attribute (name)
                cus_gender -- multi-attribute (name)
                cus_dob

Entity: products
    Attributes:
                prod_id -- primary key
                prod_name
                prod_cost
                prod_retail

Bridge Entity: buys
    Attributes:
                prod_id
                cus_id
---------------------------------------

CREATE TABLE customers (
    cus_id        NUMBER(5,0)
                  CONSTRAINT cus_id_pk
                  PRIMARY KEY (cus_id),
    cus_fname     VARCHAR2(32),
    cus_mname     VARCHAR2(32),
    cus_lname     VARCHAR2(32),
    cus_gender    NUMBER(1,0),
    cus_dob       DATE
);
-----------------------------------------
CREATE TABLE products (
    prod_id       NUMBER(5,0)
                  CONSTRAINT cus_id_pk
                  PRIMARY KEY (cus_id),
    prod_name     VARCHAR2(32),
    prod_cost     NUMBER(4,2),
    prod_retail   NUMBER(4,2)
);

1。如何创建桥实体?所以我的桥实体被称为买,我该怎么做?我在线查看,但我看到的只是选择陈述。

  1. 如何创建多值属性?与客户的名称一样,这是一个多值属性

  2. 我是否还应在主键中包含NOT NULL?我正在考虑为客户的名字添加NOT NULL。

1 个答案:

答案 0 :(得分:0)

buys称为关联表,或连接表,关系表或任何其他数量的名称。我不会将它称为“实体”,除非它真正是您系统中的实体(代表一个人,地点,事物概念或事件,可以唯一识别,是业务感兴趣,我们可以存储有关的信息。)

关联表的表定义可能如下所示:

CREATE TABLE buys
( prod_id  NUMBER(5,0) NOT NULL COMMENT 'composite PK, FK ref products.prod_id'
, cus_id   NUMBER(5,0) NOT NULL COMMENT 'composite PK, FK ref customers.cus_id'
, PRIMARY KEY (prod_id, cus_id) 
, UNIQUE KEY buys_UX1 (cus_id, prod_id)
, CONSTRAINT FK_buys_products FOREIGN KEY (prod_id) REFERENCES products (prod_id) 
  ON DELETE CASCADE ON UPDATE CASCADE     
, CONSTRAINT FK_buys_customers FOREIGN KEY (cus_id) REFERENCES customers (cus_id) 
  ON DELETE CASCADE ON UPDATE CASCADE     
) ENGINE=InnoDB
;

注意:我不相信NUMBER(5,0)是有效的MySQL数据类型。对于主键列,我倾向于使用整数数据类型INTBIGINT。但外键列必须与引用的主列的数据类型完全匹配,因此我使用NUMBER(5,0)作为引用列的数据类型的副本。

多值属性可以实现为子表,一对多关系。但我没有在模型中看到任何多值属性的迹象。

复合属性可以作为单独的表实现。但我不会去那里,除非有一个用例使这个有利。

我个人对处理复合属性的偏好是简单地在列名前加上前缀。例如,表示这些列是属性“name”的组件......

 cus_name_title
 cus_name_last
 cus_name_first
 cus_name_suffix

同样,对于“邮寄地址”属性

cus_addr_street
cus_addr_line2
cus_addr_city
cus_addr_state
cus_addr_postal_code

(其他一些关系数据库支持声明复合“类型”;我不认为这个功能在MySQL中可用。(我不会选择将复合属性表示为JSON对象。)

PRIMARY KEY约束已经在主键的所有列上强制执行NOT NULL。但是明确包含NOT NULL约束也没有坏处。我的偏好是在我们不想接受NULL值的任何列上添加NOT NULL约束。

<强>后续

对于实体的多值属性(对于单个实例,可以具有零个,一个或多个值的属性),公共模式是子表。 以客户电话号码为例。

我们可以使用外键创建表,引用客户中的cus_id。

 CREATE TABLE cus_phone_numbers 
 ( id            INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'PK'
 , cus_id        NUMBER(5,0) NOT NULL COMMENT 'FK ref customers.cus_id'
 , phone_type    VARCHAR(80)  COMMENT 'e.g. main, mobile, office, fax'
 , phone_number  VARCHAR(80)
 , CONSTRAINT FK_cus_phone_numbers_customers 
   FOREIGN KEY (cus_id) REFERENCES customers (cus_id)
   ON DELETE CASCADE ON UPDATE CASCADE
 ) ENGINE=InnoDB 
 ;

例如,拥有三个电话号码的客户在电话号码表中将有三行。没有电话号码的客户表中的行数为零。

  cus_id   phone_type    phone_number
  ------   ----------    ---------------
      42   main 1        xxx-xxx-1111
      42   office        xxx-xxx-1212
      42   fax           xxx-xxx-3333
     112   service       xxx-xxx-7701
     112   delivery      xxx-xxx-7702

这是多值属性...以及可以包含零个,一个或多个值的实体的属性。

复合属性由多个组件属性组成。例如,客户“名称”属性可以是几个简单属性的组合:

 title/salutation        'Major'
 first name              'Charles'
 middle name             'Emerson'
 last name               'Winchester'
 suffix                  'III'
 nickname                ''

始终可以将实体的某些属性拆分为单独的表,无论这些属性是简单属性还是复合属性。我们这样做的最常见原因之一是支持多个值。但我们也可以为单值属性做到这一点。

考虑“电话号码”属性。这可以建模为复合属性:

country code        +1
area code           888
exchange number     467
line number         4355