вопрос проектирования базы данных - PullRequest
1 голос
/ 17 декабря 2009

Я пытаюсь создать базу данных, но мне нужна помощь с отношениями. Я правильно понимаю дизайн стола?

Вот идея базы данных ..

Пользователь отправит инструкции, каждая из которых будет иметь один или несколько шагов, связанных с (один ко многим). Каждый шаг может иметь случайные изображения, связанные с (еще один ко многим). так что я думаю об этом:

CREATE TABLE `HowtoStepImage`  
  `id` int(10) unsigned NOT NULL auto_increment,  
  `user_id` int(10) unsigned NOT NULL,  
  `howto_id` varchar(25) NOT NULL,  
  `step_id` varchar(25) NOT NULL,  
  `img_id` int(10) unsigned NOT NULL,  
  PRIMARY KEY  (`id`),  
  KEY `hsi_k_1` (`howto_id`),  
  CONSTRAINT `hsi_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`),  
  CONSTRAINT `hsi_ibfk_2` FOREIGN KEY (`step_id`) REFERENCES `HowtoStep` (`step_id`),  
  CONSTRAINT `hsi_ibfk_3` FOREIGN KEY (`img_id`) REFERENCES `StepImage` (`id`)  
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

table HowtoStep  
step_id, title, content, created  
primary key (step_id)

table StepImage  
img_id, filename, created


CREATE TABLE `UserHowtoComment` (  
  `id` int(10) unsigned NOT NULL auto_increment,  
  `howto_id` varchar(25) NOT NULL,  
  `user_id` int(10) unsigned NOT NULL,  
  `comment` varchar(500) NOT NULL,  
  `created` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,  
  PRIMARY KEY  (`id`),  
  KEY `UserHowtoComment_ibfk_1` (`howto_id`),  
  KEY `UserHowtoComment_ibfk_2` (`user_id`),  
  CONSTRAINT `UserHowtoComment_ibfk_1` FOREIGN KEY (`howto_id`) REFERENCES `HowtoStepImage` (`howto_id`),  
  CONSTRAINT `UserHowtoComment_ibfk_2` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)  
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

однако при создании таблицы я получаю сообщение об ошибке, я уверен, что это связано с дизайном моей базы данных. вот что такое mysql> ПОКАЗАТЬ ДВИГАТЕЛЬ INNODB STATUS; показывает:

091217  9:59:59 Error in foreign key constraint of table UserhowtoComment:
 FOREIGN KEY (`howto_id`) REFERENCES `howtoStepImage` (`howto_id`),
  CONSTRAINT `UserHowtoComment_ibfk_2` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8:
Cannot find an index in the referenced table where the
referenced columns appear as the first columns, or column types
in the table and the referenced table do not match for constraint.
Note that the internal storage type of ENUM and SET changed in
tables created with >= InnoDB-4.1.12, and such columns in old tables
cannot be referenced by such columns in new tables.
See http://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html
for correct foreign key definition.

howto_id - это ключ (индекс) в UserHowtoComment. Я не уверен, что это именно та проблема здесь ...

Ответы [ 4 ]

1 голос
/ 17 декабря 2009

Составьте 3 таблицы: одну для HowTo, одну для HowToStep, одну для HowToStepImage.

Дайте каждой таблице четко определенный ключ, например, число или строка. Затем пусть дочерняя таблица ссылается на ключ родительской таблицы. Убедитесь, что столбцы также имеют четкие имена.

ТАБЛИЦА HowTo
КОЛОННЫ HowToId (ключ)

ТАБЛИЦА HowToStep
КОЛОННЫ HowToStepId (ключ), HowToId

TABLE HowToStepImage
Столбцы HowToStepImageId (ключ), HowToStepId

0 голосов
/ 17 декабря 2009

Если я правильно прочитал, ваш идентификатор HowToComment является внешним ключом для HowtoStepImage. Каждый комментарий должен иметь изображение? Похоже на курицу и яйцо. Из описания вашей проблемы кажется, что изображение ссылается на комментарий, а не наоборот.

0 голосов
/ 17 декабря 2009

вы становитесь жертвой вводящей в заблуждение терминологии в MySQL. в реляционной модели ключ (обязательно) различен. в MySQL говорят, что это просто индекс . вам нужен либо ПЕРВИЧНЫЙ КЛЮЧ , либо УНИКАЛЬНЫЙ КЛЮЧ .

изменить , чтобы явно добавить то, что подразумевается выше: внешние ключи должны указывать на ключ в реляционном смысле.

0 голосов
/ 17 декабря 2009

Ваш запрос действительно беспорядочный, например step_id varchar(25) должен быть int.

Почему вы просто не используете программу с графическим интерфейсом или, может быть, старый добрый phpMyAdmin, чтобы вы могли узнать из создаваемых ими запросов, phpMyAdmin также имеет расширенный вызов функции «Дизайнер» для создания ограничений.

...