混淆了桥实体和多属性实体

oogrdqng  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(357)

我只是有几个问题我很困惑。我不能让我的er图出现在这个帖子上,所以我不得不创建一个“文本”版本。

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如何创建桥实体?所以我的桥梁实体被称为购买,我将如何做到这一点?我在网上看了一下,但只看到了select语句。
如何创建多值属性?与客户名称一样,这是一个多值属性
我应该在主键中也包含notnull吗?我正在考虑在客户的名字中添加一个notnull。

yqlxgs2m

yqlxgs2m1#

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数据类型。对于主键列,我倾向于使用整数数据类型, INT 或者 BIGINT . 但是外键列必须与引用的主列的数据类型完全匹配,所以我使用了 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 约束。我倾向于添加 NOT NULL 对不希望接受空值的任何列的约束。
后续行动
对于实体的多值属性(对于单个示例,属性可以有零个、一个或多个值),公共模式是子表。以客户电话号码为例。
我们可以用外键创建表,引用customers中的cus\u 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

这是多值属性。。。实体的属性,该属性可以有零个、一个或多个值。
复合属性由多个组件属性组成。例如,customers“name”属性可以是几个简单属性的组合:

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

无论是简单属性还是复合属性,总是可以将实体的某些属性拆分为单独的表。我们这样做的一个最常见的原因是支持多个值。但我们也可以对单值属性这样做。
考虑“phone number”属性。可以建模为复合属性:

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

相关问题