Ne bir tabloya etiketleri eklemek için en etkili yolu olacaktır

2 Cevap php

Ben aşağıdaki tablolar vardır;

CREATE TABLE IF NOT EXISTS `tags` (
  `tag_id` int(11) NOT NULL auto_increment,
  `tag_text` varchar(255) NOT NULL,
  PRIMARY KEY  (`tag_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ;


CREATE TABLE IF NOT EXISTS `users` (
  `user_id` int(11) NOT NULL auto_increment,
  `user_display_name` varchar(128) default NULL,
  PRIMARY KEY  (`user_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=10 ;

CREATE TABLE IF NOT EXISTS `user_post_tag` (
  `upt_id` int(11) NOT NULL auto_increment,
  `upt_user_id` int(11) NOT NULL,
  `upt_post_id` int(11) NOT NULL,
  `upt_tag_id` int(11) NOT NULL,
  PRIMARY KEY  (`upt_id`),
  KEY `upt_user_id` (`upt_user_id`),
  KEY `upt_post_id` (`upt_post_id`),
  KEY `upt_tag_id` (`upt_tag_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ;

CREATE TABLE IF NOT EXISTS `view_post` (
`post_id` int(11)
,`post_url` varchar(255)
,`post_text` text
,`post_title` varchar(255)
,`post_date` datetime
,`user_id` int(11)
,`user_display_name` varchar(128)
);

Fikri bir yazı ve kullanıcılar için, etiketleri kaydetmek için en etkili şekilde kullanmak istiyorum olmasıdır. Sadece bir kere ben bu yazı ve kullanıcıya boyunca birkaç etiketlerini geçmek bir yazı ekleyin. Daha sonra her kullanıcı ve yazı için sekmeleri saymak mümkün olmak istiyorum. Yığın taşması çok benzer bir şey.

Ben 'tag_text' benzersiz olması gerektiğini varsayalım? I bir fonksiyonunu Ben bir etiket zaten var olmadığını kontrol etmek 'etiketler' masaya geçmesi için yeni bir yazı göndermek, ve evet, onun 'tag_id' dönerseniz ben 'user_post_tag' tabloya ekleyebilirsiniz her zaman çalıştırmak o kadar etkili olmadığını .

Bu belki sorun bu tür mücadele için kötü bir yaklaşımdır.

Tüm öneriler bekliyoruz.

2 Cevap

Evet, ne yapıyorsun bunu yapmak için en iyi yoldur. Bir post birden çok etiketi olabilir ve aynı etiket birden fazla mesaj üzerinde olabilir gibi, m bir ilişki için bir n yarattı. Sen mesajların her biri için etiket adını saklamak istemiyorum, bu nedenle kimliğini saklamak.

Ancak, aynı kullanıcı için birden çok kez aynı tag_id depolama bu redudancy-olmamalıdır. Kullanıcıların birden fazla etiket varsa ve bu etiketlerin her biri için SELECT count(...) yürütmek zorunda eğer sert sunucu vuracaktır. Benim burada bahsettiğimi anlıyor musun? Çünkü şu anda, nasıl bir etiket B kaç kez kullanıcı almak istiyorsunuz? Bunu yapmak olurdu SELECT count(*) FROM user_post_tag INNER JOIN tags ON (...) WHERE user_id=A and tag_id=B.

Benim önerim iki tabloya user_post_tag bölmek için:

  1. user_tags, kullanıcı bu etiketi kaç kere saymak için, birincil anahtar user_id olacak ve tag_id ve olurdu bir {[(3)] sadece bu kullanıcı etiketi ile yeni bir yazı yapar count=count+1 her ile güncelleştirmek} alanı,. Bu şekilde, sadece SELECT tag_text, count FROM user_tags INNER JOIN tags ON (...) WHERE user_id=A, belirli bir kullanıcı (kullanılan kez sayısı ile) tüm etiketleri seçmek için yapabilirsiniz. Bir tam endeksli sorgu kullanıyorsanız. Sen, masanın üzerine gitmek satır bir grup için bakmak ve onları saymak, MySQL, söylüyorsun, bu masada bu satır gitmek ve diğer masada, onlara katılmak ve hızlı, bana vermek için MySQL soran değil !
  2. post_tags, Etiketleri sahip belli bir mesajı saklamak için, birincil anahtar hiçbir ek alanlar gerekli post_id ve tag_id olacaktır.

I suppose that the 'tag_text' should be unique? Is if effective that I run a function each time I submit a new post to go through the 'tags' table to check if a tag already exists, and if yes, return its 'tag_id' so I can insert it into 'user_post_tag' table.

Evet, benzersiz olmalıdır. Bu etiketi fazlalık olan ve SEÇ yapmak zorunda değil daha eğer takmadan ve takmadan önce varolup olmadığını kontrol ... saymak (*) etiketi kullanılır olmuştur ne kadar kere bilmek için bir yol daha var. Bu mesaja seçimden daha fazla karışıklık daha sık yazı oluşturma olacak, yani sen, sorgu ekleme ve seçime yoğun olmak arasında seçim kesinlikle ekleme almak zorunda.

Kaç mesaj yığın taşması gibi, aynı etikete sahip bir sayısı var isterseniz arada, siz [(0)] {olduğu gibi, daha sonra birincil anahtar tag_id ile, başka bir tablo gerekir ve olur }, sen her bir yazı belirli bir etiket alır count alanını artırmak.

Lütfen etiketleri tüm benzersiz eğer Hmmm, o zaman etiketleri tabloda tag_id ve tag_text gerekmez. Sadece tag_text kullanın ve birincil anahtar yapmak. Sonra bakmak yeni etiketler işlemek için (http://dev.mysql.com/doc/refman/5.0/en/replace.html) REPLACE INTO.

Kullanıcılar veya mesaj ile etiketleri ilişkilendirme? masa ve post_tags tablo user_tags. user_id ve tag_text veya post_id ve tag_text ile hiçbir otomatik artım değerleri sadece bir bileşik anahtar. Eğer mesaj ve kullanıcıları ile bir post_tags tablo katılmadan üzerinde bir performans artışı için user_post_tags masada arıyorsanız ben bilmiyorum. Yine de, içine "yerine" de burada arkadaşın olmalı.