Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 2 [Все]   Вниз
  Печать  
Автор Тема: SQL-запрос для объединения таблиц  (Прочитано 50108 раз)
0 Пользователей и 1 Гость смотрят эту тему.
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« : 11-01-2010 16:14 » 

У меня есть таблица:

 -------------------------------------------
|id | cod1      | cod2          | author |
 -------------------------------------------
|1 |88.1,81.2|771.09,77.1|petrov  |
|2 |88.1,83.2|771.09        |ivanov  |
|...|....           |....               |....        |
|n |....           |....               |....        |
 -------------------------------------------

Но таблица в столбцах cod1 и cod2 не удовлетворяет первой нормальной форме (1НФ).

1НФ - требует, чтобы каждое значение атрибута или столбца было атомарным.

Я это исправил так:

Таблица2:

 ---------------------------
|id | cod1  | author_id |
 ---------------------------
|1 |88.1    |1               |
|2 |81.2    |1               |
|3 |88.1    |2               |
|4 |83.2    |2               |
 ---------------------------

Таблица3:

 ---------------------------
|id | cod2  | author_id |
 ---------------------------
|1 |771.09|1               |
|2 |77.1    |1               |
|3 |771.09|2               |
 ---------------------------

Таблица1:

 --------------
|id | author |
 --------------
|1  |petrov  |
|2  |ivanov  |
 --------------

Тогда SQL-запрос можно сделать так:


Код:
SELECT a.cod1, b.cod2, c.author FROM Таблица2 AS a, Таблица3 AS b, Таблица1 AS c
RIGHT JOIN Таблица2 AS a on a.author_id=c.id
RIGHT JOIN Таблица3 AS b on b.author_id=c.id

А что делать, если у разных авторов может повторятся author_id в таблицах 2 и 3?

Тогда же author_id в таблицах 2 и 3 не будет совпадает с id из таблицы 1.
« Последнее редактирование: 11-01-2010 17:23 от zuze » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 11-01-2010 16:39 » 

а он не должен повторяться, по идее Улыбаюсь Если есть возможность - лучше создать ещё колонку с уникальным индексом

в таблице 1 id должен называться autor_id и быть уникальным
Записан

RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 11-01-2010 16:53 » 

zuze, убедительнейшая просьба: выкладывать не картинки с "радикала", а нормальный текст!

id - это что? Имена у таблиц есть или это полная абстракция?
« Последнее редактирование: 11-01-2010 16:57 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #3 : 11-01-2010 17:00 » 

Алексей1153++, сейчас я поясню более подробно, что я имею ввиду. Представьте, что есть исходная таблица, которую нужно нормализовать:

 -------------------------------------------
|id | cod1      | cod2          | author |
 -------------------------------------------
|1 |88.1,81.2|771.09,77.1|petrov  |
|2 |88.1,83.2|771.09        |ivanov  |
|3 |89           |200.01        |sushkin|
|4 |88.1,81.2|200.01        |            |
|...|....           |....               |....        |
|n |....           |....               |....        |
 -------------------------------------------

Как видно из этой таблицы у авторов petrov и vilkin совпадает cod1, а следовательно будет совпадать author_id.
Как видно из этой таблицы у авторов sushkin и vilkin совпадает cod2, а следовательно будет совпадать author_id.

И что же в таком случае делать?

 
« Последнее редактирование: 11-01-2010 17:29 от zuze » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 11-01-2010 17:08 » 

zuze, не совсем понятно: ты хочешь вынести коды в отдельную таблицу со своими идентификаторами? А есть ли смысл? Не все и вся нужно нормализовывать. Рассмотри, что у тебя первично в отношениях объектов (повторяю вопрос: что такое id - чей id?).
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #5 : 11-01-2010 17:36 » 

Цитата: RXL
что такое id - чей id

В Таблице1 id - это уникальный идентификатор автора.
В Таблице2 id - это уникальный идентификатор строки, а author_id - это идентификатор кода (cod1) конкретного автора
В Таблице3 id - это уникальный идентификатор строки, а author_id - это идентификатор кода (cod2) конкретного автора

Может я вообще всё не так делаю и надо было всё, как-то иначе делать?

Цитата: RXL
Не все и вся нужно нормализовывать.

Как можно выяснить нужно или не нужно нормализировать?
« Последнее редактирование: 11-01-2010 17:42 от zuze » Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #6 : 11-01-2010 17:58 » 

zuze, Это ты решаеш сам. Есть примерная область применения твоей базы. И запросы, которые будут применяться к твоей базе. Ты должен определить. Какое построение данных будет наименее затратным. Также стоит обратить внимание на дальнейшее безболезненное увеличение. Так чтоб, на "я хочу" твоего начальника, тебе не пришлось полностью перелапачивать код.
« Последнее редактирование: 11-01-2010 18:01 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 11-01-2010 19:45 » 

zuze, вариантов несколько:

1. Оставить исходный вид.

2. Вынести коды в отдельную таблицу.

Код:
CREATE TABLE authors
(
  id INT PRIMARY KEY,
  name VARCHAR(100) NOT NULL
);

CREATE TABLE authors_codes
(
  author_id INT NOT NULL,
  code VARCHAR(10) NOT NULL,
  PRIMARY KEY (author_id, code)
);

3. Вынести коды в отдельный справочник и создать таблицу связи с авторами.

Код:
CREATE TABLE authors
(
  id INT PRIMARY KEY,
  name VARCHAR(100) NOT NULL
);

CREATE TABLE codes
(
  id INT PRIMARY KEY,
  code VARCHAR(10) NOT NULL
);

CREATE TABLE authors_codes
(
  author_id INT NOT NULL,
  code_id INT NOT NULL,
  PRIMARY KEY (author_id, code_id)
);

Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 11-01-2010 20:02 » 

Если cod1, cod2 обобщить до N, то появится ещё одна таблица.

Author(AuthorID,Name), где Name='petrov','ivanov',...
CodeType(CodeTypeID,Type), где Type=1,2,...
Code(CodeID,CodeTypeID,Value), где Value=88.1,771.09,...
Table(AuthorID,CodeID)

Но если в исходной таблице ID имеет какой-то смысл (например, важно, чтобы все перечисленные в cod1, cod2 полях коды логически относились к одной записи), то в Table добавится и это поле.

Возможно, CodeTypeID относится не к справочнику Code, а к основной таблице Table - это зависит от совпадения или несовпадения доменов у cod1, cod2 и т.д.
« Последнее редактирование: 11-01-2010 20:03 от Dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
McZim
Модератор

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #9 : 11-01-2010 21:39 » 

Как уже сказали вариантов масса. Единственно что нужно понять, то как будут наполняться таблицы/таблица, то есть какой будет объем данных и как потом с этими таблицами намерен работать? Какие нужны данные по каким условиям?

Кардинальных вариантов два. Оставить все в одной таблице (не так как сейчас) с одним уникальным полем id, или разнести на три таблицы, все остальное это вариации этих методов.

Задача не ясна.

RXL, второй вариант у тебя не верен, не понятно где какой код, я так понял что автору нужно четкое разграничение. Или я ошибаюсь?
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 11-01-2010 21:51 » 


например,

|id | author_id | flag|value|
----------------------------------
|1 |1               |cod1|88.1  |
|2 |1               |cod2|771.09|
|3 |1               |cod2|77.09|
если id не уникально.
если требуется уникальность записи
то еще одно поле id записи = id самой первой таблицы

1|1 |88.1|cod1|petrov  |
2|1 |81.2|cod1|petrov  |
3|1 |771.09|cod2|petrov  |
4|1 |77.1|cod2|petrov  |
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
McZim
Модератор

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #11 : 11-01-2010 22:04 » 

Sla, если ограничиваться одной таблицей, то id это и будет идентификатор уникально записи
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #12 : 11-01-2010 22:10 » 

в этом варианте есть определенное преимущество
1|1 |88.1|cod1|petrov  |
2|1 |81.2|cod1|petrov  |
3|1 |771.09|cod2|petrov  |
4|1 |77.1|cod2|petrov  |

его можно "улучшить"

CREATE TABLE authors
(
  id INT PRIMARY KEY,
  name VARCHAR(100) NOT NULL
);

CREATE TABLE codes
(
  id INT PRIMARY KEY,
  code VARCHAR(10) NOT NULL
);

CREATE TABLE values
(
  id INT PRIMARY KEY,
  id_record int,
  id_code int,
  id_authors int,
  value VARCHAR(10)
);
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
McZim
Модератор

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #13 : 11-01-2010 22:27 » 

имхо, лишнее это.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #14 : 11-01-2010 22:48 » 

Цитата: McZim
объем данных
Десятки тысяч, а может и сотни строк.

Цитата: McZim
как потом с этими таблицами намерен работать и какие нужны данные по каким условиям?
С ними будет работать скрипт таким образом, если пользователь выбирает конкретную фамилию, то выводится она и все коды относящиеся к этой фамилии.

Записан
McZim
Модератор

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #15 : 12-01-2010 08:19 » 

zuze, а как данные заносятся? Поля могут быть пустыми, если да то какие? Набор фамилий или кодов фиксированный?
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #16 : 12-01-2010 08:27 » 

Цитата:  McZim
Поля могут быть пустыми, если да то какие?

Поля cod1 или cod2 могут быть пустыми, но это редкий случай. 
Записан
McZim
Модератор

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #17 : 12-01-2010 09:14 » 

zuze, но все же могут!



* Screen shot 2010-01-12 at 12.13.31.png (57.89 Кб - загружено 1710 раз.)
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #18 : 12-01-2010 09:38 » 

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

Дело в том, что я специально для примера упростил таблицу, а в реальной таблице ещё куча столбцов и если они все будут повторятся, таблица будет накапливать очень большой объём дублирующей информации.
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #19 : 12-01-2010 09:45 » 

Не, я так не играю Улыбаюсь

Тут что главное?
Думаю что вот это
1 |88.1,81.2|771.09,77.1|petrov  |....
т.е. id записи и другие
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
McZim
Модератор

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #20 : 12-01-2010 09:54 » 

zuze, я же говорю все зависит от того что нужно в итоге, я не знаю твоей задачи и твоих требований. Если не устраивает так, то разноси, как будешь разносить это тоже дело твое, так как id авторов могут тоже повторяться в таблицу.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #21 : 12-01-2010 09:58 » 

Sla, в основной таблице есть столбцы id cod1, cod2, author и куча ещё других столбцов которые относятся к конкретному автору, вот по этому я и не стал их указывать.

Если нужно для полноты картины написать полную таблицу, я с удовольствием это сделаю.
Записан
McZim
Модератор

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #22 : 12-01-2010 10:00 » 

zuze, ты лучше расскажи что ты хочешь сделать в итоге? Какая цель? И почему у тебя в таблице не могут повторяться авторы?
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #23 : 12-01-2010 10:07 » 

Цитата: McZim
что ты хочешь сделать в итоге? Какая цель?
Разработка информационно-поисковой системы

Цитата: McZim
почему у тебя в таблице не могут повторяться авторы?
Так как все другие поля столбцов которые я не указал для простоты тоже зависят от автора и их тоже придётся дублировать, а там приличный объём информации.
Записан
McZim
Модератор

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #24 : 12-01-2010 10:16 » 

Улыбаюсь У тебя так и так будет объем информации одинаков. Например ты разнесешь данные по таблицам, в одной из таблиц у тебя будет имя автора и его id в другой таблице куча записей для этого id. Если для одного автора сопоставима куча информации в разный момент времени, что ты хочешь куда разделить что бы не было дубля. Да и вообще я не вижу дубля, каждая запись уникальна. Если у тебя все же укладываются в БД одинаковые записи, то это уже вопрос не к БД.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #25 : 12-01-2010 10:31 » 

например
CREATE TABLE books
(
  id INT PRIMARY KEY,
  author VARCHAR(100) NOT NULL,
  name VARCHAR(100) NOT NULL
);
CREATE TABLE parameters
(
  id INT PRIMARY KEY,
  id_books int,
  name_parameter  VARCHAR(100) NOT NULL,
  value_parametr VARCHAR(100)
)

вижу такое

Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #26 : 12-01-2010 10:46 » 

У меня появилась такая идея, Таблица2 и Таблица3 остаётся без изменений, а Таблица1 имеет вид:

 -------------------------------
|id | cod1 | cod2 | author |
 -------------------------------
|1 |1        |1        |petrov  |
|2 |2        |2        |ivanov  |
|3 |3        |3        |sushkin|
|4 |1        |3        |vilkin    |
|...|....      |....      |....        |
|n |x        |y         |z          |
 -------------------------------

Как Вы считаете это хорошая идея?
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #27 : 12-01-2010 11:11 » 

не понятно
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #28 : 12-01-2010 11:19 » 

Код:
Таблица2:
 ---------------------------
|id_cod1 | cod1  | author_id |
 ---------------------------
|1 |88.1    |1               |
|2 |81.2    |1               |
|3 |88.1    |2               |
|4 |83.2    |2               |
 ---------------------------

Таблица3:
 ---------------------------
|id_cod2 | cod2  | author_id |
 ---------------------------
|1 |771.09|1               |
|2 |77.1    |1               |
|3 |771.09|2               |
 ---------------------------

Таблица1:

 --------------
|id_author | author |
 --------------
|1  |petrov  |
|2  |ivanov  |
 --------------
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #29 : 12-01-2010 11:21 » 

Sla, сейчас попробую пояснить более подробно.

Есть исходная таблица:

 -------------------------------------------
|id | cod1      | cod2          | author |
 -------------------------------------------
|1 |88.1,81.2|771.09,77.1|petrov  |
|2 |88.1,83.2|771.09        |ivanov  |
|3 |89           |200.01        |sushkin|
|4 |88.1,81.2|200.01        |vilkin    |
 -------------------------------------------

Таблица2:

 ---------------------------
|id | cod1  | author_id |
 ---------------------------
|1 |88.1    |1               |
|2 |81.2    |1               |
|3 |88.1    |2               |
|4 |83.2    |2               |
|5 |89       |3               |
 ---------------------------

Таблица3:

 ---------------------------
|id | cod2  | author_id |
 ---------------------------
|1 |771.09|1               |
|2 |77.1    |1               |
|3 |771.09|2               |
|4 |200.01|3               |
 ---------------------------

Таблица1:

 -------------------------------
|id | cod1 | cod2 | author |
 -------------------------------
|1 |1        |1        |petrov  |
|2 |2        |2        |ivanov  |
|3 |3        |3        |sushkin|
|4 |1        |3        |vilkin    |
 -------------------------------

Надеюсь так стала понятно. Как Вы считаете это хорошая идея?

Записан
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #30 : 12-01-2010 11:25 » 

Алексей1153++, не понял что ты своим постом #28 хочешь сказать?
Записан
McZim
Модератор

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #31 : 12-01-2010 11:32 » 

zuze, а теперь наполни эти таблицы несколькими сотнями тысяч и посмотри план выполнения Улыбаюсь
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #32 : 12-01-2010 11:37 » 

т.е. cod's заранее известные значения?
Все равно не понятно. У тебя cod's может принимать несколько значений.

1. Таблица авторов
2. Таблица кодов
3. Таблица соответствий кодов таблице авторав
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #33 : 12-01-2010 11:39 » 

Цитата: McZim
а теперь наполни эти таблицы несколькими сотнями тысяч и посмотри план выполнения
Вы хотите сказать, что будут жуткие торможения.  
Записан
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #34 : 12-01-2010 11:42 » 

Sla, cod1 и cod2 это совершенно разные коды. cod1 может принимать одно или несколько значений и cod2 может принимать одно или несколько значений. Также cod1 или cod2 может быть пустым, но это крайне редко. Все значения в полях столбца cod1 и cod2 известны заранее.
Записан
McZim
Модератор

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #35 : 12-01-2010 11:44 » 

zuze, ты посмотри сначала на план, на стоимость, если тебя устроит то ради бога Улыбаюсь

Кстате, можно сделать так по тому примеру что я приводил.


* Screen shot 2010-01-12 at 14.42.16.png (16.66 Кб - загружено 1626 раз.)
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #36 : 12-01-2010 11:48 » 

zuze, я поясню.
Тебе понадобится добавить еще, например, cod3
Будешь делать alter table?

Проще создать таблицу cod3, а таблицы cod2 и  cod1 уже созданы, и привязать эту таблицу к таблице авторов, через таблицу параметров.

Если понадобится, то написать view, удовлетворяющую твоим требованиям.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #37 : 12-01-2010 12:30 » 

zuze, я предложил осмысленные названия к id_... Улыбаюсь
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #38 : 12-01-2010 13:29 » 

Цитата: Sla
1. Таблица авторов
2. Таблица кодов
3. Таблица соответствий кодов таблице авторав

Я же такое писал в посте #29, но вот твои пункты 1 и 3 там совмещены в одну таблицу. Я так понял это не правильно, так как это будет медленно работать и надо их разделить. Я правильно тебе понял? И таблиц кодов у меня ни одна, а две.
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #39 : 12-01-2010 13:36 » 

мне все равно сколько у тебя таблиц кодов

Основная таблица
id
name

таблица ПАРАМЕТРЫ
название параметра
значение параметра
id записи которой принадлежит этот параметр.

Две таблицы, крути как хочешь
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #40 : 12-01-2010 19:50 » 

Ужас какой-то!

Всем предлагаю в качестве наряда вне очереди дать определения нормальных форм вплоть до 3УНФ, объяснить, зачем и в каких случаях делается переход от формы к форме, и представить декомпозицию исходной таблицы по каждой нормальной форме. Улыбаюсь
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
McZim
Модератор

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #41 : 12-01-2010 20:05 » 

Dimka, н всегда нужны нормальные формы
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #42 : 12-01-2010 20:07 » 

У меня есть таблица:

 -------------------------------------------
|id | cod1      | cod2          | author |
 -------------------------------------------
|1 |88.1,81.2|771.09,77.1|petrov  |
|2 |88.1,83.2|771.09        |ivanov  |
|...|....           |....               |....        |
|n |....           |....               |....        |
 -------------------------------------------

Но таблица в столбцах cod1 и cod2 не удовлетворяет первой нормальной форме (1НФ).

1НФ - требует, чтобы каждое значение атрибута или столбца было атомарным.

Я это исправил так:

Таблица2:

 ---------------------------
|id | cod1  | author_id |
 ---------------------------
|1 |88.1    |1               |
|2 |81.2    |1               |
|3 |88.1    |2               |
|4 |83.2    |2               |
 ---------------------------

Таблица3:

 ---------------------------
|id | cod2  | author_id |
 ---------------------------
|1 |771.09|1               |
|2 |77.1    |1               |
|3 |771.09|2               |
 ---------------------------

Таблица1:

 --------------
|id | author |
 --------------
|1  |petrov  |
|2  |ivanov  |
 --------------

Тогда SQL-запрос можно сделать так:


Код:
SELECT a.cod1, b.cod2, c.author FROM Таблица2 AS a, Таблица3 AS b, Таблица1 AS c
RIGHT JOIN Таблица2 AS a on a.author_id=c.id
RIGHT JOIN Таблица3 AS b on b.author_id=c.id

А что делать, если у разных авторов может повторятся author_id в таблицах 2 и 3?

Тогда же author_id в таблицах 2 и 3 не будет совпадает с id из таблицы 1.

По требованию Dimka прочитано Улыбаюсь , в том числе и первый пост

А что делать, если у разных авторов может повторяться author_id в таблицах 2 и 3?
zuze, А как ты это представляешь?

Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #43 : 12-01-2010 20:41 » 

Цитата: Sla
А что делать, если у разных авторов может повторяться author_id в таблицах 2 и 3?
zuze, А как ты это представляешь?

Я это писал в посте #3, но напишу ещё раз  

-------------------------------------------
|id | cod1      | cod2          | author |
 -------------------------------------------
|1 |88.1,81.2|771.09,77.1|petrov  |
|2 |88.1,83.2|771.09        |ivanov  |
|3 |89           |200.01        |sushkin|
|4 |88.1,81.2|200.01        |vilkin    |
 -------------------------------------------

А вот и повторения о которых Вы спрашивали.
Как видно из этой таблицы у авторов petrov и vilkin совпадает cod1, а следовательно будет совпадать author_id.
Как видно из этой таблицы у авторов sushkin и vilkin совпадает cod2, а следовательно будет совпадать author_id.

И что же в таком случае делать?

Может можно обойтись без переделки таблиц, а добавить какие-то дополнительные условия в SQL-запрос

Код:
SELECT a.cod1, b.cod2, c.author FROM Таблица2 AS a, Таблица3 AS b, Таблица1 AS c
RIGHT JOIN Таблица2 AS a on a.author_id=c.id
RIGHT JOIN Таблица3 AS b on b.author_id=c.id
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #44 : 12-01-2010 20:52 » 

тогда скажи что такое author_id?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #45 : 12-01-2010 21:20 » 

Цитата: Sla
тогда скажи что такое author_id?
author_id - это идентификатор кода (cod1 и cod2) конкретного автора.

И из-за того что author_id из Таблицы2 или Таблицы3 не всегда равен id Таблицы1 у меня возник вопрос, то ли SQL-запрос надо модифицировать, то ли таблицы иначе составлять.
« Последнее редактирование: 12-01-2010 21:23 от zuze » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #46 : 12-01-2010 21:51 » 

zuze, ужас!

По всем понятиям author_id — это идентификатор автора. Не кода!!!
А потом уже к автору привязываются коды.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #47 : 12-01-2010 22:12 » 

Цитата: RXL
По всем понятиям author_id — это идентификатор автора. Не кода!!!

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

Таблица2:

 -----------------------------------
|id_cod1 | cod1  | num_cod1 |
 ----------------------------------- |
|1           |88.1    |1                |
|2           |81.2    |1                |
|3           |88.1    |2                |
|4           |83.2    |2                |
 -----------------------------------

Таблица3:

 -----------------------------------
|id_cod2 | cod2  | num_cod2 |
 ----------------------------------- |
|1           |771.09|1                |
|2           |77.1    |1                |
|3           |771.09|2                |
 -----------------------------------

Таблица1:

 ------------------------
|id_author | author |
 ------------------------
|1              |petrov   |
|2              |ivanov   |
 ------------------------- 

Вот теперь author_id, обозначает, то как написал RXL.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #48 : 12-01-2010 22:21 » 

И теперь видно, что связь между таблицами отсутствует - требуется еще одна или две таблицы для связей. А num_cod1 и num_cod2 вообще не понятно для чего...


Вопрос: а какая СУБД используется?
« Последнее редактирование: 12-01-2010 22:23 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #49 : 12-01-2010 22:38 » 

Цитата: RXL
Вопрос: а какая СУБД используется?
mysql

Если у меня всё так косо и криво я попробую привести ещё раз начальную таблицу и поясню её более подробно.

 -------------------------------------------
|id | cod1      | cod2          | author |
 -------------------------------------------
|1 |88.1,81.2|771.09,77.1|petrov  |
|2 |88.1,83.2|771.09        |ivanov  |
|3 |89           |200.01        |sushkin|
|4 |88.1,81.2|200.01        |vilkin    |
|...|....           |....               |....        |
|n |x,y           |u,v              |z          |
 -------------------------------------------

Подробности:
1. Я хочу эту таблицу нормализовать.
2. После столбца "author", есть ещё куча столбцов. Я их убрал для простоты примера, но каждое значение столбца связанно с другим значением другого столбца относящегося к конкретному автору (Например, есть столбец "Полное название учебного заведения").
3. Значения в столбцах cod1, cod2 и author известны и вбиваются оператором, значения в столбце id генерируется СУБД.
4. В столбцах cod1 или cod2 значение относящаяся к конкретному автору может быть пустое.
5. Значения столбцов cod1 и cod2 у разных авторов может совпадать.
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #50 : 13-01-2010 08:31 » 

Цитата: McZim
Dimka, н всегда нужны нормальные формы
Все наши беды от пуговицы. Специально повторяю ключевую фразу:
Цитата: Dimka
ОБЪЯСНИТЬ, ЗАЧЕМ И В КАКИХ СЛУЧАЯХ ДЕЛАЕТСЯ ПЕРЕХОД ОТ ФОРМЫ К ФОРМЕ
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #51 : 13-01-2010 08:54 » 

Цитата: Dimka
ОБЪЯСНИТЬ, ЗАЧЕМ И В КАКИХ СЛУЧАЯХ ДЕЛАЕТСЯ ПЕРЕХОД ОТ ФОРМЫ К ФОРМЕ
Я к сожалению знаю, только такое, что нормализация нужна, что бы избежать проблем при увеличении таблиц в будущим.
А будут ли увеличиваться таблицы или нет в будущем это обычно заранее не известно.

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

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

ru
Offline Offline
Пол: Мужской

« Ответ #52 : 13-01-2010 10:26 » 

Разбейте по сущностям:
Таблица авторов, таблица для cod1, для cod2 и сводная, куда заносятся id из каждой вышеназванной. Или я что-то не понял?
Записан

С уважением, Oldy.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #53 : 13-01-2010 13:46 » 

Цитата: zuze
К сожалению в моих книгах кроме определения нормализации и их форм с примерами, не даны обоснования когда нужно нормализировать, а когда нет.
Так прямо нигде и написано про аномалии удаления, добавления, изменения?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #54 : 13-01-2010 14:42 » 

Цитата: Dimka
Так прямо нигде и написано про аномалии удаления, добавления, изменения?

У меня всего три книги:
1. Бен Форта. Освой самостоятельно SQL. 10 минут на урок. 3-е издание
В этой книге описаны только примеры операторов и некоторые различия языка SQL для разных СУБД.

2. Люк Веллинг, Лора Томсон. Разработка Web-приложений с помощью PHP и MySql. 2-е издание.
В этой книге описаны только стандартные таблицы и использование индексов.

3. Люк Веллинг, Лора Томсон. MySql учебное пособие.
В этой книге они есть. Сейчас буду читать и вникать.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #55 : 13-01-2010 16:26 » 

zuze, у нас есть несколько статей по нормализации - думаю. что это будет лучше, чем "10 минут на урок".

https://club.shelek.ru/viewart.php?id=177
https://club.shelek.ru/viewart.php?id=311

Еще статьи здесь: https://club.shelek.ru/view.php?id=15
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: 1 2 [Все]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines