代码之家  ›  专栏  ›  技术社区  ›  three3

如何设计这个数据库布局?

  •  0
  • three3  · 技术社区  · 14 年前

    我在一个类似于Craigslist的网站上工作,在那里用户可以在不同的城市发帖和销售商品。我的网站和Craigslist的一个区别是,你可以用邮政编码搜索,而不是把所有的城市都列在页面上。

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

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

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

    我将使用php和mysql。

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

    脚本

    有人到主页上会告诉他们,“请输入你的邮政编码”。例如,如果输入“17241”,则此邮政编码适用于宾夕法尼亚州一个名叫纽维尔的城市。当前数据库设置的查询如下所示:

    SELECT city FROM zip_codes WHERE zip = 17241;
    

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

    我想这样做的一个方法是在邮政编码数据库中添加一列 城市居民 “这将是分配给每个城市的唯一编号。例如,纽维尔市的城市ID为83。所以现在,如果有人来纽约张贴一份清单,我只需要另外一张桌子。另一个表的设置如下:

    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)
    );
    

    (The 福赛尔 乔布柱 名称是用户可以列出的日志类型的类别。除了这两个类别,还有更多的类别,但这只是一个例子。)

    所以现在,当有人来到网站,想要买东西而不是卖东西时,他们可以输入邮政编码,例如17241,这是将要运行的查询:

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

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

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

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

    所以现在我的问题是,这行吗?我很肯定会的,但我不想把这件事搞砸,我意识到我忽略了一些东西,必须从头开始。

    3 回复  |  直到 14 年前
        1
  •  0
  •   HLGEM    14 年前
    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) 
    

    这不是您要求的,但是看到这个结构告诉我您需要创建一个相关的表(以及一个供选择的值使用的查阅表),而不是这样做。如果在一个表中重复列出相同的内容,则需要一个相关的表。我会有过账和过账类型(因为你有一个以上的类型,你想列出每个过账)。更像这个结构。

    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) 
    

    这使您可以自由地添加任意多个类别,而无需更改表结构。

        2
  •  0
  •   KM.    14 年前

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

    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)
    
        3
  •  0
  •   StevenWilkins    14 年前

    我会考虑像MongoDB这样的NoSQL解决方案。除了城市-邮政关系之外,您还想在这里捕获任何真正的关系约束吗?

    答案似乎是否定的。

    @科内拉克是对的,从那里开始建设。

    推荐文章