在 HABTM 關聯中儲存額外欄位

edited 十月 2013 in CakePHP
products hasAndBelongToMany tags

在 product model 中放入
var $hasAndBelongsToMany = array(
	   'Tag' => array(
	       'className' => 'Tag',
	       'joinTable' => 'products_tags',
	       'foreignKey' => 'product_id',
	       'associationForeignKey' => 'tag_id',
	   ),
	);

但是 products_tags 這個資料表除了 product_id 與 tag_id 外,我還想要記錄額外的 user_id

試了一下發現要透過這種資料結構儲存:
$data['Tag']['Tag'][0] = array('tag_id' => 1, 'user_id' => 3);
$this->Product->save($data);

雖然有點莫名其妙,但是資料可以正確儲存了。

原始討論: http://twpug.net/x/modules/newbb/viewtopic.php?topic_id=3569

評論

  • edited 九月 2008
    products_tags表 应该是用来建立 products和tags 两张表的多对多关系的连接表,加入多余的字段应该不符合database的设计的原则;我不太理解您加入user_id的目的是为什么?
  • edited 九月 2008
    在一個多對多的關聯中,有時候關聯的存在會有額外意義,像是交通工具與目的地,兩個相結合時也許會希望額外記錄當時這個組合的花費,這時候另外開一個資料表來儲存這種資訊就顯得多餘。

    當然,這是個人想法。 :)
  • edited 九月 2008
    这个应该是违反了数据库设计的第二范式,如果你要删除一个product或tag,或者是要变更product和某个tag的对应关系,这个user_id在里面的逻辑要如何处理,还有就是这样的表设计除了你本人没人能看明白,

    按我的逻辑,一个user可以hasMany product,product多对多tag,但是user和tag没有关系,可是这个products_tags(_users)表中我会理解为,user和tag有多对多,这样你的继任者除非去看你的文档说明就没法理解这是为什么
  • edited 九月 2008
    如果這個關聯是由第三者所建立的,也許就沒有所謂違反標準的問題

    簡單的說,如果我的產品資訊讓其他會員可以自行 "貼標籤" ,那麼你會怎麼設計資料表?
  • edited 九月 2008
    在1.2OCPHP文件中的"With" Associations一節中有提到跟這個主題相關的資訊,能在join tables中加入另外的欄位。

    在cookbook內的HABTM關係中還沒有更新with參數的詳細用法:(
    但有人提供不錯的參考連結 :)
  • edited 九月 2008
    不是说这样设计不行,只是觉得这样设计以后架构伸缩感觉不好,一来要写文档备注,好让他人明白;再者我想在cakephp这种ror关系设计中如果设定dependent约束,这个新加的字段很难想明白他在何种情况下会被无理抛弃;
    user可以建立私有tag,
    tags $belongsTo users;
    users $hasMany tags;


    建立的私有tag再和product相关;
    至于tag和product用何种关系连接,看您需求;

    我猜想您是基于mysql这种myisam存储类型的查询优化考虑这种设计的吧 ;)
Sign In or Register to comment.