parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Нужен совет по структуре БД

nkostya 03.05.2004 11:51 / 03.05.2004 11:54

Имеется 5 таблиц:
movie - таблица с информацией о фильмах
genre - таблица жанров
person - таблица с актерами
movie_to_genre - к каким жанрам принадлежит фильм
movie_to_person - кто снимался в фильме
#
# Table structure for table 'genre'
#

CREATE TABLE genre (
  genre_id int(10) NOT NULL auto_increment,
  title varchar(255) binary NOT NULL default '',
  PRIMARY KEY  (genre_id),
  UNIQUE KEY ix_genre_1 (title),
  KEY ix_genre_0 (genre_id)
) TYPE=MyISAM;



#
# Table structure for table 'movie'
#

CREATE TABLE movie (
  movie_id int(10) NOT NULL auto_increment,
  eng_name varchar(255) default NULL,
  rus_name varchar(255) binary NOT NULL default '',
  issue_year year(4) NOT NULL default '0000',
  site varchar(255) default NULL,
  length int(3) default NULL,
  size varchar(255) default NULL,
  shrt_description text,
  preview_id int(10) default NULL,
  poster_id int(10) default NULL,
  PRIMARY KEY  (movie_id),
  KEY ix_movie_0 (movie_id),
  KEY ix_movie_1 (rus_name),
  KEY ix_movie_2 (eng_name),
  KEY ix_movie_3 (issue_year)
) TYPE=MyISAM;


#
# Table structure for table 'movie_to_genre'
#

CREATE TABLE movie_to_genre (
  movie_id int(10) NOT NULL default '0',
  genre_id int(10) NOT NULL default '0',
  UNIQUE KEY ix_movie_genre_0 (movie_id,genre_id),
  KEY ix_movie_genre_2 (movie_id),
  KEY ix_movie_genre_1 (genre_id)
) TYPE=MyISAM;



#
# Table structure for table 'movie_to_person'
#

CREATE TABLE movie_to_person (
  movie_id int(10) NOT NULL default '0',
  person_id int(10) NOT NULL default '0',
  status tinyint(4) NOT NULL default '0',
  UNIQUE KEY ix_movie_to_person_0 (movie_id,person_id,status),
  KEY ix_movie_to_person_3 (status),
  KEY ix_movie_to_person_1 (movie_id),
  KEY ix_movie_to_person_2 (person_id)
) TYPE=MyISAM;



#
# Table structure for table 'person'
#

CREATE TABLE person (
  person_id int(10) NOT NULL auto_increment,
  eng_name varchar(255) default NULL,
  rus_name varchar(255) binary default NULL,
  PRIMARY KEY  (person_id),
  UNIQUE KEY ix_person_1 (rus_name),
  UNIQUE KEY ix_person_2 (eng_name),
  KEY ix_person_0 (person_id)
) TYPE=MyISAM;
Необходимо сделать поиск по Актерам. Запрос выглядит так:
	SELECT
		movie.movie_id as id,
		movie.rus_name,
		movie.issue_year,
		movie.shrt_description,
		IF(movie_to_genre.genre_id,0,1) as genre_not_define
	FROM
		movie
	^MAIN:pSQL.left_join[from;movie_to_genre;movie.movie_id = movie_to_genre.movie_id]
	^if(def $data.person){
		^MAIN:pSQL.left_join[from;movie_to_person;movie.movie_id = movie_to_person.movie_id]
		^MAIN:pSQL.left_join[from;person;movie_to_person.person_id = person.person_id]
	}
	WHERE
		^if(def $data.person){
			(
				^MAIN:pSQL.lower[person.rus_name] like '%^data.person.lower[]%' OR
				^MAIN:pSQL.lower[person.eng_name] like '%^data.person.lower[]%'
			) AND
		}
			(
				^if(^check_right(2)(8)){IF(movie_to_genre.genre_id,1,0) = 0 OR}
				IF(movie_to_genre.genre_id,1,0) = 1
			)
		}
	GROUP BY
		movie.movie_id
	ORDER BY
		movie.rus_name ASC,
		movie.issue_year DESC
Это сокращенный запрос, в полной версии он ищет по году создания фильма, названию, жанрам и т.д.

1) Правильно ли расставленны индексы? (оптимально-ли)
Просто плохо разбираюсь :( Может подкините материалы для расширения кругозора?

2) Можно ли оптимизировать поиск по актерам, а то уж очень долго он выполняется, просто ужасно :(

3) Да и вообще что можно оптимизировать? Принимаются любые совета...