Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Проектирование учебной базы данных каталога книг
 
 автор: Артурыч   (09.07.2011 в 15:44)   письмо автору
 
 

Почитал, вообщем, создал вот такую таблицу с полями
CREATE TABLE `katalog`.`katalog` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`katname` TEXT NOT NULL ,
`filename` TEXT NOT NULL ,
`opisanie` TEXT NOT NULL ,
`data` DATE NOT NULL
) ENGINE = MYISAM ;

Думаю будет достаточно 5-ти полей,: id файла, название категории, название файла, описание файла, и дата.

Пожалуйста, поправьте, что я не так сделал, и если можно, с объяснением ошибок :) Спасибо.
Что то мне кажется, что вместо типа TEXT надо было делать VARCHAR ()?

Кто не в теме, чтобы не пересказывать предъисторию, здесь http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=81543&page=1 начало этой темы. :)

  Ответить  
 
 автор: Valick   (09.07.2011 в 15:52)   письмо автору
 
   для: Артурыч   (09.07.2011 в 15:44)
 

`katname` TEXT NOT NULL ,
`filename` TEXT NOT NULL ,
лучше использовать VARCHAR
`data` DATE NOT NULL
лучше всетаки DATATIME

  Ответить  
 
 автор: cheops   (09.07.2011 в 15:55)   письмо автору
 
   для: Valick   (09.07.2011 в 15:52)
 

Я так понимаю это для года издания предназначалось, если да, то лучше вообще YEAR (год), если это дата добавления записи, то да, лучше DATATIME. А лучше вообще две записи иметь - одна дата добавления/изменения, другая - год издания.

  Ответить  
 
 автор: Valick   (09.07.2011 в 16:07)   письмо автору
 
   для: cheops   (09.07.2011 в 15:55)
 

как то даже и мысли не возникло что речь о книгах
где авторы? издательство?

  Ответить  
 
 автор: cheops   (09.07.2011 в 16:14)   письмо автору
 
   для: Valick   (09.07.2011 в 16:07)
 

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

  Ответить  
 
 автор: cheops   (09.07.2011 в 15:53)   письмо автору
 
   для: Артурыч   (09.07.2011 в 15:44)
 

Для начала неплохо, но лучше если вы создадите две отдельные таблицы, одна будет хранить названия каталогов, а другая книг, которые содержат эти каталоги. Для того, чтобы знать какому каталогу принадлежит книга во второй таблице заведите поле id_catalog, которое будет хранить значение id таблицы katalog. Т.е. таблица для каталогов
CREATE TABLE `katalog`.`katalog` (
 `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
 `katname` TEXT NOT NULL 
 ) ENGINE = MYISAM ;
и таблица для книг
CREATE TABLE `katalog`.`books` (
 `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
 `filename` TEXT NOT NULL ,
 `opisanie` TEXT NOT NULL ,
 `data` DATE NOT NULL,
 `id_catalog` INT
 ) ENGINE = MYISAM ;
PS Потом, если вы захотите сделать вложенные каталоги или, чтобы одна и та же книга была в нескольких каталогах - вам будет проще. Да и логично, когда одна таблица хранит данные по одной сущности - т.е. каталоги у нас в одной таблице, книги - в другой, захотите ввести авторов - лучше под них завести третью таблицу.

  Ответить  
 
 автор: Артурыч   (09.07.2011 в 16:08)   письмо автору
 
   для: cheops   (09.07.2011 в 15:53)
 

Спасибо, вникаю.
Я так понимаю, это и есть что то типа реляционных баз данных, только в простом варианте?

  Ответить  
 
 автор: cheops   (09.07.2011 в 16:16)   письмо автору
 
   для: Артурыч   (09.07.2011 в 16:08)
 

Да, совершенно верно.

  Ответить  
 
 автор: Артурыч   (09.07.2011 в 17:09)   письмо автору
 
   для: cheops   (09.07.2011 в 16:16)
 

И еще вопросик, наверно немного забегая вперед.
А как будет попадать id каталога в таблицу books? Я так понимаю, при добавлении книги, будет выбран каталог(и), в которые надо добавить книгу, а катологу присвоен соответственно уникальный id в таблице katalog.
Вопрос, а как это будет выглядеть в коде php? Если рано спрашиваю, можно не отвечать :)

  Ответить  
 
 автор: cheops   (09.07.2011 в 17:18)   письмо автору
 
   для: Артурыч   (09.07.2011 в 17:09)
 

>Я так понимаю, при добавлении книги, будет выбран каталог(и), в которые надо добавить книгу, а
>катологу присвоен соответственно уникальный id в таблице katalog.
Тут два подхода, либо вы заходите в каталог и добавляете книгу, а каталоги и их страницы друг от друга отличаются каким-то признаком, например GET-параметром в адресной строке index.php?id=4 (где id - это значение поля и таблицы katalog), тогда вам просто останется взять это значение-признак (из элемента глобального массива $_GET['id'] и подставить в запрос). Второй подход связан с выбором каталога из выпадающего списка, тут совсем все просто - данные вам в обработчик формы свалятся вместе с названием книги, её файлом (или путем к ней) и вы его подставите вместе с остальными данными в запрос.

  Ответить  
 
 автор: Артурыч   (09.07.2011 в 17:27)   письмо автору
 
   для: cheops   (09.07.2011 в 17:18)
 

Спасибо :) Ну это потом, пока с базой мудрю.
Вы написали, что все же мне надо TEXT заменить на VARCHAR, или я не правильно понял, или так и есть, VARCHAR подразумевает же не более 255 символов в ячейке, если так, то как быть, если нужно больше?

  Ответить  
 
 автор: cheops   (09.07.2011 в 17:39)   письмо автору
 
   для: Артурыч   (09.07.2011 в 17:27)
 

Это помоему Valick вверху посоветовал... не знаю, как хотите, VARCHAR - он более стандартен и используется на всех базах данных, TEXT - это особенность MySQL. Однако, сейчас на это можно не заморачиваться, все-равно базу менять нужно прилично при переносе с одной СУБД на другую. Вообще конечно TEXT - это BLOB (тип для хранения бинарной информации), заточенный под текстовые задачи.

>я не правильно понял, или так и есть, VARCHAR подразумевает же не более 255 символов в
>ячейке, если так, то как быть, если нужно больше?
Его максимальные размер 65535 символов, как и TEXT (и помоему всегда таким был, 255 - это максимальное количество индексируемых символов, тем более сейчас это значение увеличено до 1000). Понятно, что если явно ограничить количество VARCHAR(255), то больше 255 символов не влезет, но вместо 255 можно написать побольше.
Мне именно поэтому типы TINYTEXT, TEXT, MEDIUMTEXT и LONGTEXT больше нравятся - из названия сразу понятно, сколько примерно текста убирается в столбце и цифры писать не нужно.

  Ответить  
 
 автор: Артурыч   (09.07.2011 в 17:44)   письмо автору
 
   для: cheops   (09.07.2011 в 17:39)
 

Все понятно по VARCHAR, значит я немного попутал :) извиняюсь.
Кстати, не могу разобраться, как тут просто сообщение написать в тему. Нет такого варианта. Есть только ответить. Вот и отвечаю последнему написАвщему :)

  Ответить  
 
 автор: Valick   (09.07.2011 в 17:47)   письмо автору
 
   для: Артурыч   (09.07.2011 в 17:44)
 

ответить можно не только последнему, но и самому себе (на самый первый пост) это и будет "в тему"

  Ответить  
 
 автор: cheops   (09.07.2011 в 17:50)   письмо автору
 
   для: Артурыч   (09.07.2011 в 17:44)
 

>Кстати, не могу разобраться, как тут просто сообщение написать в тему. Нет такого варианта.
>Есть только ответить. Вот и отвечаю последнему написАвщему :)
Ответьте на свой первый пост (или любой другой пост из ветки) и начнется новая ветка... собственно, это изначально сделано, чтобы видеть кому предназначается ответ и не поощрять очень длинные темы. Идеальная тема - вопрос-ответ, поэтому и приветствуется каждая новая тема под ответ, чтобы старые темы не разростались. На форуме есть линейный вариант (кнопки "вид форума" справа вверху) - там есть постраничная навигация и линейное отображение от новых к старым или от старых к новым. Однако, по умолчанию, используется лестничный вариант, чтобы видеть кто кому отвечает.

  Ответить  
 
 автор: Артурыч   (09.07.2011 в 18:54)   письмо автору
 
   для: Артурыч   (09.07.2011 в 15:44)
 

И так, исходный вариант получился:

CREATE TABLE IF NOT EXISTS `books` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`filename` varchar(1000) NOT NULL,
`opisanie` varchar(3000) NOT NULL,
`data` year(4) NOT NULL,
`datebook` datetime NOT NULL,
`id_catalog` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 ;

CREATE TABLE IF NOT EXISTS `katalog` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`katname` text NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 ;

Как думаете, все верно сделал? Или можно еще чего изменить в лучшую сторону?

  Ответить  
 
 автор: cheops   (09.07.2011 в 19:15)   письмо автору
 
   для: Артурыч   (09.07.2011 в 18:54)
 

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

PS В таблицу books хорошо бы еще добавить одно поле для названия книг - по описанию будет довольно сложно ориентироваться, когда вы будете выводить список всех книг на странице - название нужно как-то выделять, будет удобно, если оно будет храниться отдельно от описания.

  Ответить  
 
 автор: Артурыч   (09.07.2011 в 19:44)   письмо автору
 
   для: cheops   (09.07.2011 в 19:15)
 

Ясно, спасибо.

  Ответить  
 
 автор: Артурыч   (09.07.2011 в 19:48)   письмо автору
 
   для: Артурыч   (09.07.2011 в 19:44)
 

 
CREATE TABLE IF NOT EXISTS `books` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `filename` varchar(1000) NOT NULL,
  `opisanie` varchar(3000) NOT NULL,
  `data` year(4) NOT NULL,
  `datebook` datetime NOT NULL,
  `id_catalog` int(11) DEFAULT NULL,
  `bookname` varchar(100) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 ;

  Ответить  
 
 автор: Гавриленко Дмитрий   (11.07.2011 в 10:53)   письмо автору
 
   для: Артурыч   (09.07.2011 в 19:48)
 

>
 
>  `filename` varchar(1000) NOT NULL,
>  `opisanie` varchar(3000) NOT NULL,
>


Максимальное кол-во значений в varchar 255. Используйте тип TEXT

  Ответить  
 
 автор: cheops   (11.07.2011 в 10:57)   письмо автору
 
   для: Гавриленко Дмитрий   (11.07.2011 в 10:53)
 

Максимальное количество символов в VARCHAR - 65535, такое же как в TEXT.

  Ответить  
 
 автор: Valick   (11.07.2011 в 11:02)   письмо автору
 
   для: Гавриленко Дмитрий   (11.07.2011 в 10:53)
 

с некоторых пор уже нет ;)
а вот имя файла в 1000 символов это конечно круть :)

  Ответить  
 
 автор: cheops   (11.07.2011 в 11:13)   письмо автору
 
   для: Valick   (11.07.2011 в 11:02)
 

Если вместе с путем хранится, то почему бы и нет... кроме того тип поля динамический, т.е. можно и максимальное значение 65535 написать - места таблица будет занимать столько же.

  Ответить  
 
 автор: Гавриленко Дмитрий   (11.07.2011 в 11:43)   письмо автору
 
   для: Valick   (11.07.2011 в 11:02)
 

С каких пор и вследствие чего?

  Ответить  
 
 автор: Valick   (11.07.2011 в 12:09)   письмо автору
 
   для: Гавриленко Дмитрий   (11.07.2011 в 11:43)
 

в следствии выхода новой версии MySQL
Values in VARCHAR columns are variable-length strings. The length can be specified as a value from 0 to 255 before MySQL 5.0.3, and 0 to 65,535 in 5.0.3 and later versions.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования