Jump to content
  • 0

Проектирование базы данных


LEXS
 Share

Question

Уж извините, что в разделе PHP хотя к PHP вопрос тоже отношение имеет.

Так вот господа знатоки, начну с пред истории. Задумал я сделать сайтик о истории нашей музыки, с возможностью внесение информации о группах через форму в базу данных, спроектировал базу сверстал шаблончик, написал код на PHP, испытав свое великое свершение пришел к выводу, что база спроектирована не правильно.

База состоит из 2х таблиц проблема только в одной

группа

альбом

год

список песен

ссылка на обложку

в результате оказалось, что каждая запись может быть внесена несколько раз. Как гарантировать уникальность (не возможность повторения) каждой строки? Идентификатор с автоикрементом, который будет являтся первичным ключем, будет гарантией уникальности? И если да то второй вопрос

Почему данный код не вносит информацию в БД?

Таблица в базе:

use имя_базы;
create table m_grup
(m_id int unsigned not null auto_increment primary key,
grup char(30) not null,
god tinyint unsigned not null,
albom char(40) not null,
pesni text not null,
oblojka char(40) not null);

запрос:

<?
if (!$grup) // да, я знаю что проверять надо наличие всех)))
{
echo "<div class='oshibka'><p class='pa'>Информация не введена!</p><p class='pb'>Заполните поля</p></div>";
niz();
exit;
}
$grup = addslashes($grup);
$god = addslashes($god);
$albom = addslashes($albom);
$pesni = addslashes($pesni);
$oblojka = addslashes($oblojka);
$info = addslashes($info);
@ $bd = mysql_pconnect ("localhost", "имя_базы", "пароль");
if (!$bd)
{
echo "База не существует";
exit;
}
mysql_select_db("имя_базы");
$zapros = "insert into m_grup values ('".$grup."', '".$god."', '".$albom."', '".$pesni."', '".$oblojka."')";
$result = mysql_query ($zapros);
if (!$result)
echo "Ничего";
?>

База существует, привелегии позволяют

Получаю в результате "Ничего" и отсутствие строки в таблице, хотя ошибок не выдает.

Смутно я понимаю, что проблема в m_id (идентификаторе), если убрать его то все работает, но не гарантирует уникальности строке, и вобщем-то догадываюсь, проблема либо в том что m_id int unsigned not null auto_increment primary key и в том что не упоминаю m_id в запросе, но как исправить? Сорри если задаю глупые вопросы делаю только первые шаги и в PHP и в SQL

Edited by LEXS
Link to comment
Share on other sites

12 answers to this question

Recommended Posts

  • 0

Сразу заметно что знаний по БД никаких нет. Нужно хотя бы первичное представление что это такое и как это делается, основы так сказать. Обрати внимание на следующие моменты, они же ключевые слова

- первичный ключ;

- отношение один-ко-многим, отношение один-к-одному;

- дублирование данных;

- избыточность данных.

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

Переходить к PHP в последнюю очередь, когда будет структура отлажена.

Link to comment
Share on other sites

  • 0

Я скажу, как бы я сделал.

1-ая таблица(groups):

id - первичный ключ с автоинкрементом;

title - название группы;

year - год;

image - ссылка на обложку.

Здесь есть небольшое разветвление. Можно привязывать песни к альбомом, а можно сделать эти 2 таблицы независимыми. Не буду оба варианта рассматривать - сам догадаешь, объясню второй.

2-ая таблица(albums):

id - первичный ключ с автоинкрементом;

title - название альбома;

group_id - идентификатор, указывающий на id группы.

Можно сюда же добавить и другую информацию по альбому - то что я привёл - это минимум.

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

Link to comment
Share on other sites

  • 0

Я бы сделал так:



<?php
$db = mysql_connect("localhost","login","password");
mysql_select_db("name_bd",$db);


if (isset ($grup) && isset($god) && isset($albom) && isset($pesni) && isset($oblojka) && isset($info))
{
$result = mysql_query ("INSERT INTO table (grup,god,albom,pesni,oblojka,info) VALUES ('$grup','$god','$albom','$pesni','$oblojka','$info')");
if ($result == 'true') {echo "<p>Информация успешно занесена в базу!</p>";}
else {echo "<p>Информация не добавлена!</p>";}
}
else
{
echo "<p>Вы ввели не всю информацию, поэтому она не может быть добавлена в базу!</p>";
}
?>

Вот как-то так...

Link to comment
Share on other sites

  • 0

Ребят, а какая разница как он отформатирован?

Да, согласен, именно здесь на форуме выглядет некрасиво, но это дело того, кто его в последствии будет использовать.

Если в нем есть другие недочеты, то это уже другое дело, но код 100% рабочий.

Link to comment
Share on other sites

  • 0

Господа я опять к вам :blink:

Никак я не отрою пример реализации. Допустим если все упростить до придела, есть 2 таблицы из двух столбов

Первая

ID (автоинкремент, первичный ключ)

group

Вторая

ID

ID_group

albom

есть форма с двумя полями ввода

albom

group

как должен выглядеть код SQL чтобы гарантировать уникальность данных в столбцах group и albom?

А то при повторном вводе такой же информации получается дублирование в таблице. Например ввожу первый раз Группа1, Альбом1, второй Группа1, Альбом2

получаю в первой таблице:

Первая таблица

ID group

1 Группа1

2 Группа1

а хотелось этого избежать, ведь данная запись уже есть идентификатор у нее 1. Как это сделать? Как должнен выглядеть код таблиц?

Да, и если можете, посоветуйте книжку хорошую по SQL (лучше MySQL), а то у меня есть пара но там толком данный момент не освещен.

Edited by LEXS
Link to comment
Share on other sites

  • 0

Вот такая фигня получилась, сильно не ругайтесь))

create table m_grup

(id_grup smallint unsigned auto_increment primary key,

grup char(40) not null);

create table m_alb

(id_alb tinyint unsigned auto_increment primary key,

alb char(60) not null);

create table m_god

(id_god tinyint unsigned auto_increment primary key,

god char(25) not null);

create table m_var

(id_var tinyint unsigned auto_increment primary key,

var char(20) not null);

create table m_nosit

(id_nosit tinyint unsigned auto_increment primary key,

nosit char(4) not null);

create table m_izd

(id_izd smallint unsigned auto_increment primary key,

izd char(20) not null);

create table m_stil

(id_stil tinyint unsigned auto_increment primary key,

stil char(20) not null);

create table m_bit

(id_bit smallint unsigned auto_increment primary key,

bit char(9) not null);

create table m_kom_mp3

(id_kom_mp3 smallint unsigned auto_increment primary key,

kom_mp3 char(30) not null);

create table m_form

(id_form smallint unsigned auto_increment primary key,

form char(6) not null);

create table m_kom_loss

(id_kom_loss smallint unsigned auto_increment primary key,

kom_loss char(30) not null);

create table m_rel

(id_rel mediumint unsigned auto_increment primary key,

id_grup smallint unsigned not null,

id_alb tinyint unsigned not null,

id_god tinyint unsigned not null,

id_var tinyint unsigned not null,

id_nosit tinyint unsigned not null,

id_izd smallint unsigned not null,

id_stil tinyint unsigned not null,

id_bit smallint unsigned not null,

id_kom_mp3 smallint unsigned not null,

ssil_mp3 char(255) not null,

spek_mp3 char(50) not null,

id_form smallint unsigned not null,

id_kom_loss smallint unsigned not null,

log text not null,

ssil_loss char(255) not null,

spek_loss char(50) not null,

ssil_obl char(255) not null,

treklist text not null);

+ 5 страниц php для ввода\вывода, выложил бы для критики, не уверен, что все рационально сделал, но боюсь места многовато займет

Edited by LEXS
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy