要构建 Body Parts 搜索功能,让我们使用 MySQL V5.0 作为数据存储并使用 Sphinx search 守护程序来提供快速而精确的文本搜索。MySQL V5.0 是一个功能强大的数据库,但是它的增强型全文本搜索功能并不特别丰富。实际上,它仅限于 MyISAM 表 -- 不支持外键的一种表格式,因此使用有限。 PHP程序员站
清单 1 至清单 4 显示了与此示例相关的 Body Parts 模式的部分代码。您将分别看到 Model(清单 1)、Assembly(清单 2)、Inventory(清单 3)和 Schematic(清单 4)表。 www.phperz.com
Model 表 PHP程序员站--PHP程序员之家
清单 1 中所示的 Model 表十分简单:label 列将列举车型的名称 ("Corvette");description 使用客户友好方式进行描述("两门跑车;第一年引入");而 begin_production 和 end_production 分别表示开始生产和结束生产该车型的年份。由于前述列中的值并不惟一,因此使用一个独立 ID 表示每四个这样的元素(label、description、begin_production、end_production),并且是其他表中的外键。 www phperz com
清单 1. 车身零件 Model 表
CREATE TABLE Model ( id int(10) unsigned NOT NULL auto_increment, label varchar(7) NOT NULL, description varchar(256) NOT NULL, begin_production int(4) NOT NULL, end_production int(4) NOT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB;
phperz.com
下面是 Model 表的一些样例数据: PHP程序员站--PHP程序员之家
INSERT INTO Model (`id`, `label`, `description`, `begin_production`, `end_production`) VALUES (1,'X Sedan','Four-door performance sedan',1998,1999), (3,'X Sedan','Four door performance sedan, 1st model year',1995,1997), (4,'J Convertible','Two-door roadster, metal retracting roof',2002,2005), (5,'J Convertible','Two-door roadster',2000,2001), (7,'W Wagon','Four-door, all-wheel drive sport station wagon',2007,0); PHP程序员站
Assembly 表 www~phperz~.com
assembly 是一个子系统,例如汽车上安装的传动装置或所有玻璃。车主使用部件图及相关零件列表来查找备件。清单 2 中所示的 Assembly 表也十分简单:它将把一个惟一 ID 与部件标签和描述关联起来。 www~phperz~.com
清单 2. Assembly 表
CREATE TABLE Assembly ( id int(10) unsigned NOT NULL auto_increment, label varchar(7) NOT NULL, description varchar(128) NOT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB;
www~phperz~.com
继续示例,下面是 Assembly 表的一些样例数据: www.phperz.com
INSERT INTO Assembly (`id`, `label`, `description`) VALUES (1,'5-00','Seats'), (2,'4-00','Electrical'), (3,'3-00','Glasses'), (4,'2-00','Frame'), (5,'1-00','Engine'), (7,'101-00','Accessories'); www.phperz.com
Inventory 表
PHP程序员站
Inventory 表是汽车零件的典范列表。零件 -- 例如螺钉或灯泡 -- 可能用于每辆汽车和多个部件中,但是零件只在 Inventory 表中显示一次。Inventory 表中的每行包含: phperz.com
使用了惟一的 32 位整数 serialno 标识行。 字母数字零件号(此零件号惟一并且可以用作主键。但是,由于它可以包含字母数字字符,因此它不适于与 Sphinx 结合使用,Sphinx 要求索引的每条记录都有一个惟一的 32 位整型键)。 文本描述。 价格。 Inventory 表的规范如清单 3 中所示: phperz.com
清单 3. Inventory 表
CREATE TABLE Inventory ( id int(10) unsigned NOT NULL auto_increment, partno varchar(32) NOT NULL, description varchar(256) NOT NULL, price float unsigned NOT NULL default '0', PRIMARY KEY (id), UNIQUE KEY partno USING BTREE (partno) ) ENGINE=InnoDB;
www.phperz.com
零件的(部分)列表可能如下面所示:
PHP程序员站--PHP程序员之家
INSERT INTO `Inventory` (`id`, `partno`, `description`, `price`) VALUES (1,'WIN408','Portal window',423), (2,'ACC711','Jack kit',110), (3,'ACC43','Rear-view mirror',55), (4,'ACC5409','Cigarette lighter',20), (5,'WIN958','Windshield, front',500), (6,'765432','Bolt',0.1), (7,'ENG001','Entire engine',10000), (8,'ENG088','Cylinder head',55), (9,'ENG976','Large cylinder head',65); PHP程序员站--PHP程序员之家
Schematic 表 www~phperz~.com
Schematic 表将把零件与部件和车型版本绑定在一起。因此,将使用 Schematic 表来查找组装 1979 J Class 敞篷车引擎的所有零件。Schematic 表中的每行都有一个惟一 ID,一个引用 Inventory 表行的外键,一个标识部件的外键,以及用于引用 Model 表中特定型号和版本的另一个键。各行如清单 4 所示: www.phperz.com
清单 4. Schematic 表
CREATE TABLE Schematic ( id int(10) unsigned NOT NULL auto_increment, partno_id int(10) unsigned NOT NULL, assembly_id int(10) unsigned NOT NULL, model_id int(10) unsigned NOT NULL, PRIMARY KEY (id), KEY partno_index USING BTREE (partno_id), KEY assembly_index USING BTREE (assembly_id), KEY model_index USING BTREE (model_id), FOREIGN KEY (partno_id) REFERENCES Inventory(id), FOREIGN KEY (assembly_id) REFERENCES Assembly(id), FOREIGN KEY (model_id) REFERENCES Model(id) ) ENGINE=InnoDB;
PHP程序员站
为了强化表的意图,下面是 Schematic 中的一张小型行列表:
www.phperz.com
INSERT INTO `Schematic` (`id`, `partno_id`, `assembly_id`, `model_id`) VALUES (1,6,5,1), (2,8,5,1), (3,1,3,1), (4,5,3,1), (5,8,5,7), (6,6,5,7), (7,4,7,3), (8,9,5,3); www phperz com
搜索表
www.phperz.com
定义了这些表后,就可以轻松地响应很多搜索: PHP程序员站--PHP程序员之家
显示特定型号的所有版本 列出装配特殊型号和版本所需的所有部件
|