分享
 
 
 

Linux数据库大比拚(二)

王朝system·作者佚名  2006-11-23
窄屏简体版  字體: |||超大  

作 者: Matthias Warkus

数据库设计

编者按:这是涉及可自由地获得的Linux DBMS的系列文章的第二部分。

为了测试并比较3个数据库管理系统,我当然需要一个数据库来管理他们。在读完了《SQL傻瓜书》后,我有了一些如何设计现实的数据库的基本知识,因此我拣选了一特别无聊的真实世界情形(一个因特网书店,其他?)并且写下了一个小型数据库设计以便探讨一点Sql的能力。

在这个数据库里有5个表,BOOK保存可得到的书的登记信息;CUSTOMER包含登记的顾客。对每份订单,BOOKORDER创建一行,参照其顾客。对每个定购的项目,在ORDER_POSITION里引用它的订单号。作为一种奖励,针对书的排名我增加了一RATING表。

下列的SQL代码可装入到一个数据库系统的SQL监控程序并且被接受应该没有任何问题。所有的表在创建前被删除因此确保他们不会在创建之前已经存在。

DROP TABLE BOOK;

CREATE TABLE BOOK (

ARTICLE_NO INTEGER PRIMARY KEY,

AUTHOR_FIRST_NAMES CHARACTER(30),

AUTHOR_LAST_NAMES CHARACTER(30),

TITLE CHARACTER(30),

ISBN CHARACTER(13) UNIQUE,

WHOLESALE_PRICE NUMERIC(4,2),

RETAIL_PRICE NUMERIC(4,2),

COPIES_AVAILABLE INTEGER

);

DROP TABLE CUSTOMER;

CREATE TABLE CUSTOMER (

CUSTOMER_NO INTEGER PRIMARY KEY,

FIRST_NAMES CHARACTER(30),

LAST_NAMES CHARACTER(30),

STREET CHARACTER(30),

HOUSE_NO SMALLINT,

POSTCODE CHARACTER(7),

TOWN CHARACTER(30),

ISO_COUNTRY_CODE CHARACTER(2)

);

DROP TABLE BOOKORDER;

CREATE TABLE BOOKORDER (

ORDER_NO INTEGER PRIMARY KEY,

CUSTOMER_NO INTEGER NOT NULL,

ORDERED DATE,

DELIVERY DATE,

STATUS CHARACTER(8)

CHECK (STATUS IN (′ACCEPTED′,

′DELAYED′,

′SHIPPED′,

′RETURNED′,

′PAID′)),

CONSTRAINT CUSTOMER_FK FOREIGN KEY (CUSTOMER_NO)

REFERENCES KUNDE (KUNDENNAME)

);

DROP TABLE ORDER_POSITION;

CREATE TABLE ORDER_POSITION (

POSITION_NO INTEGER PRIMARY KEY,

ORDER_NO INTEGER NOT NULL,

ARTICLE_NO INTEGER NOT NULL,

NUMBER SMALLINT,

CONSTRAINT ORDER_FK FOREIGN KEY (ORDER_NO)

REFERENCES BOOKORDER (ORDER_NO),

CONSTRAINT BOOK_FK FOREIGN KEY (ARTICLE_NO)

REFERENCES BOOK (ARTICLE_NO)

);

DROP TABLE RATING;

CREATE TABLE RATING (

RATING_NO INTEGER PRIMARY KEY,

ARTICLE_NO INTEGER NOT NULL,

SCORE NUMERIC(1,0),

COMMENT CHARACTER VARYING(300),

CONSTRAINT BOOK_FK FOREIGN KEY (ARTICLE_NO)

REFERENCES BOOK (ARTICLE_NO)

);

当然,这是一个极其简单的数据库。它看上去真实,但是它不适用于真实世界的应。它不保存顾客记录或任何东西,并且它甚至没有书的出版商的列。它只是一个测试环境。

注意我不想花大气力强制CUSTOMER.ISO_COUNTRY_CODE为今天是实际有效的编码。我在代码做了一点限制以测试数据库系统是否接受他们;我没尝试使数据库无懈可击。

改变设计适应PostgreSQL

当我将遵循ANSI标准的CREATE TABLE语句装入Postgresql的psql监控视程序是,我遇到的困难是很少的。我得到一些警告:外部关键字限制被接受但还没有实现,而且我不得不裁减RATING的COMMENT字段到255个字符,因为这是PostgreSQL的CHARACTER VARYING类型的字段的最大字段宽度。系统为存储大量数据提供BLOB数据类型,但是它们不在标准版本内,因此我决定了不使用他们。另外的问题是相当愚蠢--因为我不能找到有关PostgreSQL如何强制NUMERIC到C数据类型,也因为我不想使用float以避免舍入,我决定使得货币字段为分值(cent)的整数数字。

我最后得到了这个略有不同的脚本:

DROP TABLE BOOK;

CREATE TABLE BOOK (

ARTICLE_NO INTEGER PRIMARY KEY,

AUTHOR_FIRST_NAMES CHARACTER(30),

AUTHOR_LAST_NAMES CHARACTER(30),

TITLE CHARACTER(30),

ISBN CHARACTER(13) UNIQUE,

WHOLESALE_PRICE INTEGER,

RETAIL_PRICE INTEGER,

COPIES_AVAILABLE INTEGER

);

DROP TABLE CUSTOMER;

CREATE TABLE CUSTOMER (

CUSTOMER_NO INTEGER PRIMARY KEY,

FIRST_NAMES CHARACTER(30),

LAST_NAMES CHARACTER(30),

STREET CHARACTER(30),

HOUSE_NO SMALLINT,

POSTCODE CHARACTER(7),

TOWN CHARACTER(30),

ISO_COUNTRY_CODE CHARACTER(2)

);

DROP TABLE BOOKORDER;

CREATE TABLE BOOKORDER (

ORDER_NO INTEGER PRIMARY KEY,

CUSTOMER_NO INTEGER NOT NULL,

ORDERED DATE,

DELIVERY DATE,

STATUS CHARACTER(8)

CHECK (STATUS IN (′ACCEPTED′,

′DELAYED′,

′SHIPPED′,

′RETURNED′,

′PAID′)),

CONSTRAINT CUSTOMER_FK FOREIGN KEY (CUSTOMER_NO)

REFERENCES KUNDE (KUNDENNAME)

);

DROP TABLE ORDER_POSITION;

CREATE TABLE ORDER_POSITION (

POSITION_NO INTEGER PRIMARY KEY,

ORDER_NO INTEGER NOT NULL,

ARTICLE_NO INTEGER NOT NULL,

NUMBER SMALLINT,

CONSTRAINT ORDER_FK FOREIGN KEY (ORDER_NO)

REFERENCES BOOKORDER (ORDER_NO),

CONSTRAINT BOOK_FK FOREIGN KEY (ARTICLE_NO)

REFERENCES BOOK (ARTICLE_NO)

);

DROP TABLE RATING;

CREATE TABLE RATING (

RATING_NO INTEGER PRIMARY KEY,

ARTICLE_NO INTEGER NOT NULL,

SCORE SMALLINT,

COMMENT CHARACTER VARYING(255),

CONSTRAINT BOOK_FK FOREIGN KEY (ARTICLE_NO)

REFERENCES BOOK (ARTICLE_NO)

);

使设计适应MySQL

MySQL象PostgreSQL一样忽略外部关键字的限制,但是它搞了个UNIQUE限制。最后的脚本与PostgreSQL脚本差不多:

DROP TABLE BOOK;

CREATE TABLE BOOK (

ARTICLE_NO INTEGER PRIMARY KEY,

AUTHOR_FIRST_NAMES CHARACTER(30),

AUTHOR_LAST_NAMES CHARACTER(30),

TITLE CHARACTER(30),

ISBN CHARACTER(13),

WHOLESALE_PRICE INTEGER,

RETAIL_PRICE INTEGER,

COPIES_AVAILABLE INTEGER

);

DROP TABLE CUSTOMER;

CREATE TABLE CUSTOMER (

CUSTOMER_NO INTEGER PRIMARY KEY,

FIRST_NAMES CHARACTER(30),

LAST_NAMES CHARACTER(30),

STREET CHARACTER(30),

HOUSE_NO SMALLINT,

POSTCODE CHARACTER(7),

TOWN CHARACTER(30),

ISO_COUNTRY_CODE CHARACTER(2)

);

DROP TABLE BOOKORDER;

CREATE TABLE BOOKORDER (

ORDER_NO INTEGER PRIMARY KEY,

CUSTOMER_NO INTEGER NOT NULL,

ORDERED DATE,

DELIVERY DATE,

STATUS CHARACTER(8),

CONSTRAINT CUSTOMER_FK FOREIGN KEY (CUSTOMER_NO)

REFERENCES KUNDE (KUNDENNAME)

);

DROP TABLE ORDER_POSITION;

CREATE TABLE ORDER_POSITION (

POSITION_NO INTEGER PRIMARY KEY,

ORDER_NO INTEGER NOT NULL,

ARTICLE_NO INTEGER NOT NULL,

NUMBER SMALLINT,

CONSTRAINT ORDER_FK FOREIGN KEY (ORDER_NO)

REFERENCES BOOKORDER (ORDER_NO),

CONSTRAINT BOOK_FK FOREIGN KEY (ARTICLE_NO)

REFERENCES BOOK (ARTICLE_NO)

);

DROP TABLE RATING;

CREATE TABLE RATING (

RATING_NO INTEGER PRIMARY KEY,

ARTICLE_NO INTEGER NOT NULL,

SCORE NUMERIC(1,0),

COMMENT CHARACTER VARYING(255),

CONSTRAINT BOOK_FK FOREIGN KEY (ARTICLE_NO)

REFERENCES BOOK (ARTICLE_NO)

);

使设计适应 mSQL

因为mSQL是一个精简的数据库管理器(的确,有些人可能怀疑MySQL和mSQL是否是数据库管理系统),它放弃了大多数Sql的功能而仅仅接受SQL的一个严格限制的子集。这样,mSQL的脚本看上有很大不同:

DROP TABLE BOOK

CREATE TABLE BOOK (

ARTICLE_NO INTEGER NOT NULL,

AUTHOR_FIRST_NAMES CHARACTER(30),

AUTHOR_LAST_NAMES CHARACTER(30),

TITLE CHARACTER(30),

ISBN CHARACTER(13),

WHOLESALE_PRICE MONEY,

RETAIL_PRICE MONEY,

COPIES_AVAILABLE INTEGER

)

DROP TABLE CUSTOMER

CREATE TABLE CUSTOMER (

CUSTOMER_NO INTEGER NOT NULL,

FIRST_NAMES CHARACTER(30),

LAST_NAMES CHARACTER(30),

STREET CHARACTER(30),

HOUSE_NO SMALLINT,

POSTCODE CHARACTER(7),

TOWN CHARACTER(30),

ISO_COUNTRY_CODE CHARACTER(2)

)

DROP TABLE BOOKORDER

CREATE TABLE BOOKORDER (

ORDER_NO INTEGER NOT NULL,

CUSTOMER_NO INTEGER NOT NULL,

ORDERED DATE,

DELIVERY DATE,

STATUS CHARACTER(1)

)

DROP TABLE ORDER_POSITION

CREATE TABLE ORDER_POSITION (

POSITION_NO INTEGER NOT NULL,

ORDER_NO INTEGER NOT NULL,

ARTICLE_NO INTEGER NOT NULL,

NUMBER SMALLINT

)

DROP TABLE RATING

CREATE TABLE RATING (

RATING_NO INTEGER NOT NULL,

ARTICLE_NO INTEGER NOT NULL,

SCORE SMA

[1] [2] 下一页

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有