0

我正在一个类似于 Craigslist 的网站上工作,用户可以在该网站上发布帖子并在不同城市销售商品。我的网站和 Craigslist 之间的一个区别是您将能够通过邮政编码进行搜索,而不是在页面上列出所有城市。

我已经拥有邮政编码数据库,其中包含每个城市的所有城市、州、纬度、经度和邮政编码信息。好的,所以要深入了解我需要做的事情和需要帮助的事情:

  1. 虽然我有邮政编码数据库,但它的设置并不适合我的使用。(我是从网上免费下载的http://zips.sourceforge.net/

  2. 我需要帮助设置我的数据库结构(例如我应该使用多少个不同的表以及我应该如何链接它们)。

我将使用 PHP 和 MySQL。

到目前为止,这些是我对如何设置数据库的想法:(我不确定这是否可行。)

设想

有人去主页,它会告诉他们,“请输入您的邮政编码。”。例如,如果他们输入“17241”,则此邮政编码是针对位于宾夕法尼亚州的一个名为 Newville 的城市。使用当前数据库设置,查询将如下所示:

SELECT city FROM zip_codes WHERE zip = 17241;

查询的结果将是“Newville”。我现在在这里看到的问题是,当他们想在网站的 Newville 部分发布内容时,我将不得不为 Newville 市的帖子设置一个完整的表格。有超过 42,000 个城市,这意味着我必须拥有超过 42,000 张桌子(每个城市一张),所以必须这样做是很疯狂的。

我正在考虑的一种方法是在邮政编码数据库中添加一个名为“ city_id ”的列,这将是分配给每个城市的唯一编号。例如,城市 Newville 的 city_id 为 83。所以现在如果有人来在 Newville 城市发布列表,我只需要另一个表。另一个表将像这样设置:

CREATE TABLE postings (
posting_id INT NOT NULL AUTO_INCREMENT,
for_sale LONGTEXT NULL,
for_sale_date DATETIME NULL,
for_sale_city_id INT NULL,
jobs LONGTEXT NULL,
jobs_date DATETIME NULL,
jobs_city_id INT NULL,
PRIMARY KEY(posting_id)
);

for_salejob_ 列名称是用户可以在下面列出的发布类型的类别。除了这两个类别之外,还有更多类别,但这只是示例。)

因此,现在当有人访问该网站并且他们正在寻找可以购买而不是出售的东西时,他们可以输入他们的邮政编码,例如 17241,这就是将运行的查询:

SELECT city, city_id FROM zip_codes WHERE zip = 17241; //Result: Newville 83

(我将使用 PHP 存储用户在 SESSIONS 和 Cookies 中输入的邮政编码,以便在整个站点中记住它们)

现在它会告诉他们,“请选择您的类别。”。如果他们选择“待售物品”类别,那么这是运行查询并对结果进行排序:

SELECT posting_id, for_sale, for_sale_date FROM postings WHERE for_sale_city_id = $_SESSION['zip_code'];

所以现在我的问题是,这行得通吗?我很确定它会,但我不想设置这个东西并意识到我忽略了一些东西并且必须从头开始。

4

3 回答 3

0

我会考虑像mongodb这样的nosql解决方案。除了 city-zip 关系之外,您还想在这里捕捉任何真正的关系约束吗?

似乎这里的答案是否定的。

@Konerak 是对的,开始做一些事情并从那里开始构建。

于 2010-05-10T20:16:07.380 回答
0
CREATE TABLE postings ( 
posting_id INT NOT NULL AUTO_INCREMENT, 
for_sale LONGTEXT NULL, 
for_sale_date DATETIME NULL, 
for_sale_city_id INT NULL, 
jobs LONGTEXT NULL, 
jobs_date DATETIME NULL, 
jobs_city_id INT NULL, 
PRIMARY KEY(posting_id) 

这不是你问的,但看到这个结构告诉我你需要创建一个相关表(以及一个用于选择值的查找表),而不是这样做。如果你在一个表中重复列出相同的东西,你需要一个相关的表。我会有帖子和 Posting_type (因为你有不止一种类型,你想在每个帖子中列出。更像这种结构的东西。

CREATE TABLE postings ( 
posting_id INT NOT NULL AUTO_INCREMENT, 
posting_description LONGTEXT NULL, 
Posting_date DATETIME NULL, 
PRIMARY KEY(posting_id) 

CREATE TABLE posting_categories ( 
posting_id INT NOT NULL, 
Category_id int
Primary Key (posting_id, Category_id)

CREATE TABLE Categories ( 
category_id INT NOT NULL AUTO_INCREMENT, 
category_description LONGTEXT NULL, 
PRIMARY KEY(category_id) 

这使您可以在不更改表结构的情况下自由添加任意数量的类别。

于 2010-05-11T19:29:43.987 回答
0

对于每种类型的列表,我不会有一组列,而是一个“posting_type”列:

CREATE TABLE postings (
posting_id INT NOT NULL AUTO_INCREMENT,
posting_type char(1),             <<<"J"=job,"S"=for sale, etc.
posting_text LONGTEXT NULL,
posting_date DATETIME NULL,
posting_city_id INT NULL,
PRIMARY KEY(posting_id)
于 2010-05-10T19:42:42.020 回答