如何:一对多到一对多?在PHP中

时间:2011-07-11 15:14:21

标签: php mysql database-normalization

我正在建立一个在线商店。该商店有几个类别(~10个),类别有几个产品(每个约10个),产品有许多子产品(每个20+)。

这是我陷入困境的部分:

子产品有几列细节。这些产品还有10个标题。

这就是产品的样子:

http://www.ampedwebdesign.com/bear/new2/public/products/images/straightpins.jpg

标题是背景较暗的单元格,副产品是行。

这是我的标题类的一部分:

class Header extends DatabaseObject {

  protected static $table_name="headers";
  protected static $db_fields=array('id', 'product_id', 'col1', 'col2', 'col3', 'col4', 'col5', 'col6', 'col7', 'col8', 'col9', 'col0', 'col1', 'col2');

  public $id;
  public $product_id;
  public $col1;
  public $col2;
  public $col3;
  public $col4;
  public $col5;
  public $col6;
  public $col7;
  public $col8;
  public $col9;
  public $col10;
  public $col11;
  public $col12;

产品视图调用产品类来显示图像。然后,产品视图调用header类以按product_id返回标头。然后,产品视图调用子产品类以按product_id返回子产品。然后,产品视图调用子产品类以在foreach循环中返回子产品详细信息。

任何帮助都会受到赞赏,当我知道有更好的方法时,我讨厌编写这样的代码。我只是不知道如何找到它。

我的数据库表:产品,子产品,类别,标题

1 个答案:

答案 0 :(得分:3)

我通常会在解决这样的问题时采取的第一步是尽可能normalize the schema。看看你的示例产品,这就是我的想法:

  • items:列numberprice
  • attributes:列idtitle
  • items_attributes:列item_idattribute_idvalue

然后,在查询数据库时:

   SELECT title, value
     FROM items_attributes
    WHERE item_id = 123
LEFT JOIN attributes
          ON items_attributes.attribute_id = attributes.id;

我的MySQL有点生疏,因此语法可能不是100%正确,但希望这会帮助您朝着正确的方向前进。

修改

正如rootatwc在评论中所提到的,InnoDB存储引擎支持外键,允许您执行级联UPDATEDELETE s < / strong>这样您就不会收到大量的孤立数据,并强制执行检查约束,以确保您不会获得虚假/超出范围的数据。 Wikipedia对这些机制有一个相当不错的解释。