Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   PHP, PERL, MySQL, JavaScript (https://forum.antichat.xyz/forumdisplay.php?f=37)
-   -   [sql] несколько вопросов по реализации БД (https://forum.antichat.xyz/showthread.php?t=112117)

Neoveneficus 20.03.2009 14:14

[sql] несколько вопросов по реализации БД
 
Вопрос 1
Есть таблица "ЗАКАЗЫ", есть в ней поле, в котором должны храниться id вероятных исполнителей. Их много и они уникальны.

Как организовать хранение так, чтобы можно было легко проверить, есть ли данный id исполнителя в текущей записи?

Вопрос 2
Есть таблица "ИСПОЛНИТЕЛИ", в ней есть поле "дисциплины". Один "исполнитель" может иметь несколько дисциплин. В поле "дисциплины" будут храниться несколько уникальных id дисциплин из таблицы "ДИСЦИПЛИНЫ".

Как организовать хранение, чтобы было легко делать выборку из таблицы "ИСПОЛНИТЕЛИ" по одному значению id дисциплины.

Rebz 20.03.2009 14:46

хм.. попробуй на листочке нарисовать эти таблицы с атрибутами (полями).
Проставь связь между таблиц (1:1, 1:N, N:M).
Там где N:M (многие ко многим) - можно создать доп.табличку для слияния 2-х таблиц.
Почитай про нормальные формы БД
http://ru.wikipedia.org/wiki/%D0%9D%D0%BE%D1%80%D0%BC%D0%B0%D0%BB%D0%B8%D0%B7%D 0%B0%D1%86%D0%B8%D1%8F_%D0%91%D0%94

PS лучше самому догадаться, чтобы понять суть, чем другие подскажут ;)

PPS http://www.sql-ex.ru - хороший сайт с упражнениями по sql (требуется регистрация)

Neoveneficus 20.03.2009 14:51

Так, я, видимо, неправильно выразился. Мне нужно придумать структуру БД на MySQL. Я просто не знаю, как такие вещи реализуются. Я могу написать по-кустарному, но хочется воспользоваться средствами самой БД, а не php. Уверен, такие средства есть.

Neoveneficus 20.03.2009 15:36

так, тема актуальна
кто знает, как хранить в одной ячейке массив значений, чтобы легко работать было с ним:
выбирать значения и редактировать средствами самого sql?

Chaak 20.03.2009 15:47

Таблица "заказы"
PHP код:

CREATE TABLE `orders` (
`
dev_idINT NOT NULL ,
UNIQUE (
`
dev_id
)
ENGINE InnoDB 

Проверка будет осуществлятся:
PHP код:

SELECT dev_id
FROM orders
WHERE 
   dev_id
='1'
LIMIT 1 

-------------------------------------------

Таблица "исполнители"
PHP код:

CREATE TABLE `devs` (
`
idINT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`
nameVARCHAR30 NOT NULL ,
`
jobsVARCHAR700 NOT NULL 
ENGINE InnoDB 

Записи для теста:
PHP код:

INSERT INTO `devs` (
`
id` ,
`
name` ,
`
jobs
)
VALUES (
NULL 'Chaak''<jobs><job id=''1'' /><job id=''2'' /></jobs>'
);

INSERT INTO `devs` (
`
id` ,
`
name` ,
`
jobs
)
VALUES (
NULL 'Neoveneficus''<jobs><job id=''1'' /><job id=''3'' /></jobs>'
); 

Вот так оно выглядит:
PHP код:

id     name     jobs 
   1    Chaak    
<jobs><job id='1' /><job id='2' /></jobs>
   
2    Neoveneficus    <jobs><job id='1' /><job id='3' /></jobs


Запрос выборки имени по id занятий:
PHP код:

SELECT name
FROM devs
WHERE jobs LIKE 
'%<job id=\'1\' />%'
LIMIT 0 30 

<job id=\'1\' /> - еденичка это id занятий исполнителя :)

VDShark 21.03.2009 11:20

Chaak омфк))))
Neoveneficus предлагаю след. структуру.
Рассмотрим на примере заказов и вероятных исполнителей.
Будет 3 таблицы:

1) Заказы
2) Исполнители
3) Назовем ее к примеру Заказы_Исполнители (хотя название нормальное стоило бпридумать)


У заказов и исполнителей есть id-шники и еще какая то инфа.
А у таблицы Заказы_Исполнители будет след. структура:

id_заказа
id_исполнителя
... (здесь можно вставить еще какую-либо вспомогательную инфу, если она необходима).


Первичный ключ в данной таблице будет составной, а именно
id_заказа + id_исполнителя
В свою очередь эти пля ссылаются на те таблички (заказы и исполнители... для поддержания целостности БД).

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

Neoveneficus 21.03.2009 12:50

VDShark, кул, но:
Как сделать составной первичный ключ?
Как сделать ссылки на другие таблицы?
Как джойнить таблички? Что это значит?
Что такое коррелирующий подзапрос?

=) буду очень благодарен, если разжуешь =)

VDShark 21.03.2009 13:19

Цитата:

Сообщение от Neoveneficus
VDShark, кул, но:
Как сделать составной первичный ключ?
Как сделать ссылки на другие таблицы?
Как джойнить таблички? Что это значит?
Что такое коррелирующий подзапрос?

=) буду очень благодарен, если разжуешь =)

Всюинфу можно легко найти :) Но распишу

1) Составной первичный ключ
Код:

PRIMARY KEY (поле1, поле2)

2) FOREIGN KEY ... REFERENCES
Подробнее http://dev.mysql.com/doc/refman/5.0/...nstraints.html

3) Джойнить от слова JOIN - соединение... Подробнее про это ты можешь почитать в моей статье
sql. Явные операции соединения. Как готовить и с чем есть.

4) Что такое коррелирующий подзапрос тоже не буду расписывать... Это достаточно хорошо расписано в дружественном для sql-ex проекте sqlbooks :)
Коррелирующие подзапросы


Время: 01:06