对于这个应用程序,需要保存如下所示的细节信息。
■Lists(列表):可供订阅的邮件列表。
■Subscribers(订阅者):系统用户和他们的个人喜好信息。
■Sublists(订阅列表):记录哪些用户订阅了哪些邮件列表(多对多的关系)。
■Mail(邮件):已经发送的邮件消息的记录。
■Images(图像):由于我们想要发送由多个文件组成的邮件消息,必须跟踪每个邮件附带的文本、HTML和图像。
用来创建该数据库的SQL如程序清单30-1所示。
程序清单30-1 create_database.sql——创建mlm数据库的SQL
create database mlm;
use mlm;
create table lists
(
listid int auto_increment not null primary key,
listname char(20)not null,
blurb varchar(255)
);
create table subscribers
(
email char(100)not null primary key,
realname char(100)not null,
mimetype char(1)not null,
password char(40)not null,
admin tinyint not null
);
#stores a relationship between a subscriber and a list
create table sub_lists
(
email char(100)not null,
listid int not null
);
create table mail
(
mailid int auto_increment not null primary key,
email char(100)not null,
subject char(100)not null,
listid int not null,
status char(10)not null,
sent datetime,
modified timestamp
);
#stores the images that go with a particular mail
create table images
(
mailid int not null,
path char(100)not null,
mimetype char(100)not null
);
grant select,insert,update,delete
on mlm.*
to [email protected] identified by'password';
insert into subscribers values
('[email protected]','Administrative User','H',sha1('admin'),1);
注意可以通过输入如下命令来执行这个SQL脚本:
mysql-u root-p<create_database.sql
必须提供root用户密码(当然,也可以通过任何具有适当权限的MySQL用户来执行该脚本;这里,我们为了简便仅使用root用户)。在运行这个脚本之前,应该修改该脚本中的mlm用户和管理员的密码。
该数据库的某些字段需要稍作解释,我们简单地看一下。lists表包括listid字段和listname字段。它还包括一个blurb字段,它描述了该列表的主要内容。
subscribers表包括电子邮件地址(E-mail)字段和订阅者的名字(realname)字段。该表还保存了用户密码和一个用来表明该用户是否是管理员的标记(admin)字段。我们还要在mimetype字段中存储用户想要接收的邮件类型。这里,可以用H代表HTML或T代表文本。
sublists表包括关于来自subscribers表的邮件地址(E-mail)和来自lists表的listids。
mail表包括关于通过系统发送的每条邮件消息的信息。它保存了唯一标识(mailid)、邮件从何处发送而来的地址(E-mail)、邮件的主题行(subject)和已经发送的或将要被发送的列表listid。消息的实际文本或HTML版本可能是一个大文件,因此我们在数据库之外存储实际消息的存档文件。我们还保存一些常规状态信息:消息是否已经被发送了(status),什么时候发送的(sent),以及显示该记录最后一次修改的时间戳(modified)。
最后,我们用images表来记录任何与HTML消息有关的图像。同样,这些图像可能非常大,因此出于效率的考虑,我们将它们保存在数据库之外。我们需要记录与之相关联的mailid、图像实际存储位置的路径和图像的MIME类型(mimetype),例如image/gif。
前面所示的SQL脚本还将为PHP创建一个用户,通过这个用户,PHP可以连接数据库,同时,该用户还是系统的管理用户。