Linux中国 Linux中国门户站!
设为主页 设为主页
收藏本站 收藏本站
 
当前位置 :首页 ->Linux技术 ->Linux程序设计 ->正文

锋线上的冲杀——论Linux数据库大比拚

来源: 作者: 时间:2007-04-11 点击: [收藏] [投稿]

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

注意我不想花大气力强制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



 如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<



上一篇:Linux入门普及读物 解读Linux编程库   下一篇:Linux系统套接字编程中存在的五个隐患

文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论
更多相关文章
Power by linux-cn.com 粤ICP备05006655号