SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 11.12.2011 02:41:03

ew4oo
Участник
Зарегистрирован: 30.07.2011
Сообщений: 11

Зачем нужны реляции 1:1

У меня предположим 2 таблицы.
Первая таблица хранит название каталогов.
Во второй таблице находятся названия файлов, и id каталога, к которому относится файл.


CREATE  TABLE `PSPK`.`category_of_documents` (
  `id` INT  AUTO_INCREMENT PRIMARY KEY,
  `name` VARCHAR(100) ,
)
ENGINE = InnoDB;


CREATE  TABLE `PSPK`.`Document` (
  `id` INT AUTO_INCREMENT  PRIMARY KEY,
  `name` VARCHAR(45) ,
  `category` INT ,
)
ENGINE = InnoDB


В данном случае получается отношение один к одному.
Один файл может находится только в одном каталоге.

Теперь вопрос: зачем создавать реляции, если можно создать 2 таблицы MyIsam.
И в конечном итоге они будут делать тоже самое, только не нужно будет создавать PRIMARY i FOREIGN ключи.


Я всё пытаюсь разобраться в этой "философии" и никак не получается.
Очень надеюсь,что кто-нибудь мне объяснит.

Неактивен

 

#2 11.12.2011 02:47:28

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Зачем нужны реляции 1:1

Вообще тут скорее отношение один ко многим - много файлов может находиться в одном каталоге.

> Теперь вопрос: зачем создавать реляции, если можно создать 2 таблицы MyIsam.
Поясните плиз, что Вы имели в виду под реляцией?

Использование вторичного ключа на поле category таблицы Document даст гарантию того, что вы сможете привязать документ только к реально существующей категории документов. Плюс даст дополнительные плюшки, такие как каскадное удаление (или наоборот невозможность удалить категорию документов, если вдруг в ней еще есть документы). Но это - в случае использования innodb, а не myisam.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 11.12.2011 17:57:12

ew4oo
Участник
Зарегистрирован: 30.07.2011
Сообщений: 11

Re: Зачем нужны реляции 1:1

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

Например документация к автомобилям. Выбираю категорию AUDI
Меня перенаправляет на страницу, где будет список моделей
- Q7
-A8
-A6
и т.д.

То есть я могу вывести всех производителей. А затем модели, относящиеся к определённому производителю.
И всё это я могу сделать без реляций между таблицами.

Приблизительный запрос:

SELECT * FROM `Document`
WHERE `category` = 1

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

Неактивен

 

#4 11.12.2011 19:00:47

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Зачем нужны реляции 1:1

Что вы называете "реляцией"?


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 11.12.2011 19:03:08

ew4oo
Участник
Зарегистрирован: 30.07.2011
Сообщений: 11

Re: Зачем нужны реляции 1:1

"какая либо связь"

Неактивен

 

#6 11.12.2011 19:25:42

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Зачем нужны реляции 1:1

Приведите пожалуйста структуры Ваших таблиц - как Вы преполагаете определять марку автомобиля по автомобилю, если эти таблицы никак не связаны?!


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#7 11.12.2011 21:19:22

ew4oo
Участник
Зарегистрирован: 30.07.2011
Сообщений: 11

Re: Зачем нужны реляции 1:1

CREATE  TABLE `marka_avto` (
   `id` INT  AUTO_INCREMENT PRIMARY KEY,
   `name` VARCHAR(45) ,
)
ENGINE = MyISAM;


CREATE  TABLE `model_avto` (
   `id` INT AUTO_INCREMENT  PRIMARY KEY,
   `name` VARCHAR(45) ,
   `category` INT
)
ENGINE = MyISAM


А вот php код:
   $result = mysql_query('SELECT id,name FROM marka_avto');

    while($row = mysql_fetch_array($result)){
            echo '<a href="?category='.$row['id'].'">'.$row['name'].'</a>';
    }


Со страницы, на которую пользователь перешёл, из $_GET возьму id марки авто и подставлю в запрос:
SELECT * FROM `model_avto`
WHERE `category` = "$_GET['category']"

Отредактированно ew4oo (11.12.2011 21:20:05)

Неактивен

 

#8 11.12.2011 21:36:13

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Зачем нужны реляции 1:1

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

А если создадите вторичный ключ (и сделаете таблички innodb), то база просто не даст Вам это сделать. Тем самым Вы избавите себя от лишней работы, переложив её на базу.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#9 12.12.2011 14:24:01

ew4oo
Участник
Зарегистрирован: 30.07.2011
Сообщений: 11

Re: Зачем нужны реляции 1:1

Спасибо. Теперь всё понял.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson