第3节任务
有四个任务需要在本章完成:
1.建立一个数据库用户。
2.建立两个关系数据库,一个作为数据仓库,另外一个作为源数据库。
3.为数据仓库建立数据库表。
4.产生代理键。
每个任务将在独立的小节中说明。
建立一个数据库用户id
第一步产生一个数据库用户,你可以用该帐户进行操作数据仓库和数据源。
在你开始前,确信你已经将本书随附的脚本文件放置在mysql的安装目录下面。例如,我的安装目录是C:\mysql,所以我将我的脚本文件放在C:\mysql\scripts目录中。
我们开始将用root用户登陆mysql,请输入下面的命令:C:\>mysql -uroot -p
你将被提示输入密码:
Enter password: ********
输入密码后,将看到控制台的欢迎信息:Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 6 to server version: 5.0.21-community-ntType 'help;' or '\h' for help. Type '\c' to clear the buffer.mysql>
敲入密码后的这些信息是当一个root用户登陆mysql时典型的回应信息。列表1-1所示的脚本create_user_id.sql产生一个用户id dwid其密码是pw。
列表1-1:创建dwid用户id
/*****************************************************************/*/
/* create_user_id.sql*/
/**/
/*****************************************************************/
GRANT ALL ON *.* TO dwid@localhost IDENTIFIED BY 'pw';
/* end of script
用下面的命令方式运行该脚本:mysql> \. c:\mysql\scripts\create_user_id.sql
回车后,你将看到回应的信息:Query OK, 0 rows affected (0.03 sec)
用show grants命令,你可以确认用户id:dwid是否已经被成功创建,你应该在命令中包含你的mysql服务器名称:mysql> show grants for dwid@localhost;
假如存在用户dwid,你可以看到如下信息:Grants for dwid@localhostGRANT ALL PRIVILEGES ON *.* TO 'dwid'@'localhost' IDENTIFIED BYPASSWORD '*D821809F681A40A6E379B50D0463EFAE20BDD122'1 row in set (0.00 sec)
注意密码部分在你的显示屏上显示的方式将不同于上面的描述。
现在你需要退出mysq然后用dwid用户登陆,退出mysql用exit命令:mysql> exit
为了以dwid身份登陆mysql,可以用下面的命令:c:\>mysql -udwid -p
然后输入dwid的密码,记住,密码是pw。
建立数据库
有两个数据库需要建立,源数据(source)和数据仓库(dw)。Source数据库存储你的数据,也就是这些数据将成为你的数据仓库的源数据。Dw数据库是为了作为数据仓库建立的。
可以用列表1-2中的create_databases.sql脚本进行创建数据库。
列表1.2:建立dw和source数据库
/*****************************************************************/
/**/
/* create_databases.sql*/
/**/
/*****************************************************************/
CREATE DATABASE dw
;
CREATE DATABASE source
;
运行create_databases.sql脚本的命令如下:mysql> \. c:\mysql\scripts\create_databases.sql
在你的控制台界面上,你将看到:Query OK, 1 row affected (0.00 sec)Query OK, 1 row affected (0.00 sec)
你可以用show databases命令来确认上面的命令是否成功运行。为了确认dw数据库被创建用下面命令:mysql> show databases like 'dw';
回应信息将如下面所示:+---------------+| Database (dw) |+---------------+| dw|+---------------+1 row in set (0.00 sec)
为了确认source数据库被成功创建用下面命令:mysql> show databases like 'source';
回应信息将如下面所示:+-------------------+| Database (source) |+-------------------+| source|+-------------------+1 row in set (0.00 sec)创建数据仓库表第二步是在dw数据库中创建数据仓库表。你可以用列表1-3所示的create_dw_tables.sql脚本来创建图1-1中的sales_order_fact表和四个维表。
列表1-3:创建数据仓库表
/*****************************************************************/
/**/
/* create_dw_tables.sql*/
/**/
/*****************************************************************/
/* default to dw database*/
USE dw;
/* creating customer_dim table*/
CREATE TABLE customer_dim
( customer_sk INT NOT NULL AUTO_INCREMENT PRIMARY KEY
, customer_number INT
, customer_name CHAR (50)
, customer_street_address CHAR (50)
, customer_zip_code INT (5)
, customer_city CHAR (30)
, customer_state CHAR (2)
, effective_date DATE
, expiry_date DATE )
;
/* creating product_dim table*/
CREATE TABLE product_dim
( product_sk INT NOT NULL AUTO_INCREMENT PRIMARY KEY
, product_code INT
, product_name CHAR (30)
, product_category CHAR (30)
, effective_date DATE
, expiry_date DATE )
;
/* creating order_dim table*/
CREATE TABLE order_dim
( order_sk INT NOT NULL AUTO_INCREMENT PRIMARY KEY
, order_number INT
, effective_date DATE
, expiry_date DATE )
;
/* creating date_dim table*/
CREATE TABLE date_dim
( date_sk INT NOT NULL AUTO_INCREMENT PRIMARY KEY
, date DATE
, month_name CHAR (9)
, month INT (1)
, quarter INT (1)
, year INT (4)
, effective_date DATE
, expiry_date DATE )
;
/* creating sales_order_fact_table*/
CREATE TABLE sales_order_fact
( order_sk INT
, customer_sk INT
, product_sk INT
, order_date_sk INT
, order_amount DECIMAL (10, 2) )
;现在运行create_dw_tables.sql脚本:mysql> \. c:\mysql\scripts\create_dw_tables.sql你的控制台将显示如下类似的信息:Database changedQuery OK, 0 rows affected (0.13 sec)Query OK, 0 rows affected (0.12 sec)Query OK, 0 rows affected (0.12 sec)Query OK, 0 rows affected (0.10 sec)Query OK, 0 rows affected (0.11 sec)你可以用show createtable命令确认某个表是否被创建成功,例如,为了验证customer_dim表是否创建成功,用这个命令:mysql> show create table customer_dim \G在你的控制台界面上,将可以看到:*************************** 1. row ***************************Table: customer_dimCreate Table: CREATE TABLE 'customer_dim' ('customer_sk' int(11) NOT NULL auto_increment,'customer_number' int(11) default NULL,'customer_name' char (50) default NULL,'customer_street_address' char (50) default NULL,'customer_zip_code' int (5) default NULL,'customer_city' char (30) default NULL,'customer_state' char (2) default NULL,'effective_date' date default NULL,'expiry_date' date default NULL,PRIMARY KEY ('customer_sk')) ENGINE=InnoDB DEFAULT CHARSET=latin11 row in set (0.00 sec)用相同的方式,可以确认其他表是否成功创建。产生代理键本节的最后一个任务是用列表1-4所示的customer_sk.sql脚本创建代理键,这个脚本将向customer_dim表插入3条记录。
列表1-4:产生 客户代理键值
/******************************************************************/
/**/
/* customer_sk.sql*/
/**/
/******************************************************************/
/* default to dw*/
USE dw;
INSERT INTO customer_dim
( customer_sk
, customer_number
, customer_name
, customer_street_address
, customer_zip_code
, customer_city
, customer_state
, effective_date
, expiry_date )
VALUES
(NULL, 1, 'Big Customers', '7500 Louise Dr.', '17050',
'Mechanicsburg', 'PA', CURRENT_DATE, '9999-12-31')
, (NULL, 2, 'Small Stores', '2500 Woodland St.', '17055',
'Pittsburgh', 'PA', CURRENT_DATE, '9999-12-31')
, (NULL, 3, 'Medium Retailers', '1111 Ritter Rd.', '17055'
'Pittsburgh', 'PA', CURRENT_DATE, '9999-12-31')
;
/* end of script*/运行customer_sk.sql脚本之前,你必须将你的mysql时间设置为:2007-02-01,这是因为customer_sk.sql脚本中的CURRENT_DATE函数用操作系统的时间作为载入effective_date字段的值,而我就是在这个时间运行customer_sk.sql脚本的。你可以通过将mysql运行的机器的系统的时间修改为特定的值来修改mysql时间。注意要牢记,这里你改变mysql的时间只是为了能比较平滑结合这个学习教程,实际的生产环境中,你不能在运行脚本的前后改变你的数据库或者系统的时间。事实上,你应该在数据库仓库环境中安排部署你的各个脚本定期的运行。如何定期安排将在第8节“定期载入”中讨论。注意你的mysql监控端将在系统时间被修改后断开和mysql服务端的连接,为了确保你运行脚本不会有什么问题,在调整时间后,试着运行一下诸如“use dw”的简单的命令,你将得到一个错误的信息提示,但是你的监控端将重新连接上mysql。你可以再次运行“use dw”命令来确定已经连接上myslq服务器,这次,你不会再得到任何错误提示了。现在,你已经将mysql的时间调整到2007-02-01,可以用如下的命令运行列表1-4中所示的脚本,mysql> \. c:\mysql\scripts\customer_sk.sql你将在你的控制台上看到如下信息:Database changedQuery OK, 3 rows affected (0.06 sec)Records: 3Duplicates: 0Warnings: 0查询该表,你可以看到这个脚本已经准确的插入代理键值了。
mysql> select * from customer_dim \G
*************************** 1. row ***************************
customer_sk: 1
customer_number: 1
customer_name: Big Customers
customer_street_address: 7500 Louise Dr.
customer_zip_code: 17050
customer_city: Mechanicsburg
customer_state: PA
effective_date: 2007-02-01
expiry_date: 9999-12-31
*************************** 2. row ***************************
customer_sk: 2
customer_number: 2
customer_name: Small Stores
customer_street_address: 2500 Woodland St.
customer_zip_code: 17055
customer_city: Pittsburgh
customer_state: PA
effective_date: 2007-02-01
expiry_date: 9999-12-31
*************************** 3. row ***************************
customer_sk: 3
customer_number: 3
customer_name: Medium Retailers
customer_street_address: 1111 Ritter Rd.
customer_zip_code: 17055
customer_city: Pittsburgh
customer_state: PA
effective_date: 2007-02-01
expiry_date: 9999-12-31
3 rows in set (0.00 sec)
mysql>
现在运行列表1-5中的脚本more_customer_sk.sq来增加更多的行。
列表1-5:插入更多客户资料
/*****************************************************************/
/**/
/* more_customer_sk.sql*/
/**/
/*****************************************************************/
USE dw;
INSERT INTO customer_dim (
customer_sk
, customer_number
, customer_name
, customer_street_address
, customer_zip_code
, customer_city
, customer_state
, effective_date
, expiry_date
)
VALUES
(NULL, 4, 'Good Companies', '9500 Scott St.', '17050',
'Mechanicsburg', 'PA', CURRENT_DATE, '9999-12-31')
, (NULL, 5, 'Wonderful Shops', '3333 Rossmoyne Rd.', '17050',
'Mechanicsburg', 'PA', CURRENT_DATE, '9999-12-31')
, (NULL, 6, 'Loyal Clients', '7070 Ritter Rd.', '17055',
'Pittsburgh', 'PA', CURRENT_DATE, '9999-12-31')
;下面说明如何运行more_customer_sk.sql脚本mysql> \. c:\mysql\scripts\more_customer_sk.sql你将看到:Database changedQuery OK, 3 rows affected (0.06 sec)Records: 3Duplicates: 0Warnings: 0如果你查询customer_dim表,将发现有6条记录在该表中:mysql> select * from customer_dim \G*************************** 1. row ***************************customer_sk: 1customer_number: 1customer_name: Big Customerscustomer_street_address: 7500 Louise Dr.customer_zip_code: 17050customer_city: Mechanicsburgcustomer_state: PAeffective_date: 2007-02-01expiry_date: 9999-12-31*************************** 2. row ***************************customer_sk: 2customer_number: 2customer_name: Small Storescustomer_street_address: 2500 Woodland St.customer_zip_code: 17055customer_city: Pittsburghcustomer_state: PAeffective_date: 2007-02-01expiry_date: 9999-12-31*************************** 3 row ***************************customer_sk: 3customer_number: 3customer_name: Medium Retailerscustomer_street_address: 1111 Ritter Rd.customer_zip_code: 17055customer_city: Pittsburghcustomer_state: PAeffective_date: 2007-02-01expiry_date: 9999-12-31*************************** 4. row ***************************customer_sk: 4customer_number: 4customer_name: Good Companiescustomer_street_address: 9500 Scott St.customer_zip_code: 17050customer_city: Mechanicsburgcustomer_state: PAeffective_date: 2007-02-01expiry_date: 9999-12-31*************************** 5. row ***************************customer_sk: 5customer_number: 5customer_name: Wonderful Shopscustomer_street_address: 3333 Rossmoyne Rd.customer_zip_code: 17050customer_city: Mechanicsburgcustomer_state: PAeffective_date: 2007-02-01expiry_date: 9999-12-31*************************** 6. row ***************************customer_sk: 6customer_number: 6customer_name: Loyal Clientscustomer_street_address: 7070 Ritter Rd.customer_zip_code: 17055customer_city: Pittsburghcustomer_state: PAeffective_date: 2007-02-01expiry_date: 9999-12-316 rows in set (0.01 sec)不要删除这些客户记录,在下个章节中,你将用到它们。第4节 小结这一个节,你学习了星型模式和代理键。你还建立两个数据库以及操作这两个数据库的mysql用户。下面的章节,你将使用和扩展这些数据库。