我只是有一些我很困惑的问题。我无法让我的图表出现在这篇文章中,所以我不得不创建一个"文本"版本。
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。如何创建桥实体?所以我的桥实体被称为买,我该怎么做?我在线查看,但我看到的只是选择陈述。
如何创建多值属性?与客户的名称一样,这是一个多值属性
我是否还应在主键中包含NOT NULL?我正在考虑为客户的名字添加NOT NULL。
答案 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数据类型。对于主键列,我倾向于使用整数数据类型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
约束也没有坏处。我的偏好是在我们不想接受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