Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.05;
Скачать: CL | DM;

Вниз

Зачем связывают таблицы?   Найти похожие ветки 

 
parovoZZ ©   (2006-01-09 01:51) [0]

Народ, а зачем таблицы связывают? Прочитал целую книгу по этому поводу и ещё кучу статей в инете.

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

родительском поле.

Но это какие-то слабенькие доводы в пользу сабжа.
Если не так, то тогда следующая задачка.
Есть две таблицы : Equipments и Objects (даны фрагменты)

Equipments
-------------------------------------------------
   Equipment   |    Object   |  System       |
-------------------------------------------------
               |             |               |

Objects
-------------------------------------------------
 Object_ID*   |   Object    |             |
-------------------------------------------------
              |             |             |  

Поле Object верхней таблицы связано с полем Object_ID (ключевое) нижней.
Так вот, я с помощью запроса

SELECT Object FROM Equipments WHERE System=:prmID

получаю кучу значений поля Object (фактически Object_ID). А вот как теперь по этим значениям

получить сопоставленные им значения из поля Object таблицы Objects? В цикле? А нельзя ли сразу в

SQL-запросе это организовать? Если нет, какой мне торч от того, что эти таблицы связаны. Всё

равно поиск происходит на программном уровне.


 
ЮЮ ©   (2006-01-09 03:20) [1]

"Связывать", конечно, можно и на уровне запроса, но здесь приходится уже "гадать на кофейной гуще". Кстати, твоя Objects в этом смысле очень показательна. Ибо по названиям полей не понть какая связь должна быть
Equipments.Object <-> Objects.Object
или
Equipments.Object <-> Objects.ObjectId

>А нельзя ли сразу в SQL-запросе это организовать?
А что мешает?

SELECT *
FROM
 Equipments Eq
 [LEFT] JOIN Objects Obj ON Eq.Object = Obj.ObjectId
WHERE
 System=:prmID


 
Fay ©   (2006-01-09 04:25) [2]

2 parovoZZ ©   (09.01.06 1:51)
> Невозможность удаления информации в подчиненном поле пока есть
> ссылка на него у родителя.
Что такое "подчиненное поле"?
Что такое "ссылка на него у родителя"?

> Невозможность выбора иной, нежели представленной у подчиненного
> поля, информации в родительском поле.
Что такое "информация в родительском поле"?
В чём заключается "выбор" информации?

Вы, похоже, путаете детей с родителями. Это плохо.

> Но это какие-то слабенькие доводы в пользу сабжа
Это вАщЕ хрень какая-то. Что Вы понимаете под словом "связывание"?
Если join, то сказаное в пунктах 1 и 2 не справедливо.
Если reference в виде foreign key, то это же contraint (!), т.е. ограничение. Какие ещё, блин, доводы?

Прочитайте свои книги ещё раз.

> Есть две таблицы : Equipments и Objects (даны фрагменты)
Описывая структуру, используйте DDL - Вас поймут все, кто в состоянии ответить.

> получаю кучу значений поля Object (фактически Object_ID).
Что значит "фактически Object_ID"? У Вас имеется зависимость межжу ключевыми и неключевыми полями?! Фтопку!

> А вот как теперь по этим значениям получить сопоставленные им
> значения из поля Object таблицы Objects? В цикле?
На этот вопрос уже ответил ЮЮ [1]; скажу лиши, что он (вопрос) вызывает недоумение. Бросайте на время писать - ещё не всё прочитано.


 
parovoZZ ©   (2006-01-09 11:13) [3]

ВООБЩЕ запутали меня. Есть связка Equipments.Object <-> Objects.Object_ID  Эти два поля должны быть обязательно ключевыми? Зачем? Т.е. при изменении (UPDATE) информации в любом из них она изменится в другом? Тогда не понятно, что такое "один ко многим".

А что такое DDL? Мы такого не проходили. А по поводу книг - правильно. Читал ночью и очень бегло. Ну очень было интересно как это всё устроено.


 
Dioman ©   (2006-01-09 11:46) [4]


> parovoZZ ©   (09.01.06 11:13) [3]


RTFM


 
Fay ©   (2006-01-09 11:58) [5]

2 parovoZZ ©   (09.01.06 11:13) [3]
> Эти два поля должны быть обязательно ключевыми?
Только для связи 1 к 1(0).

> Т.е. при изменении (UPDATE) информации в любом из них она изменится в другом?
Только при on update cascade или по просьбе тригера.

> Тогда не понятно, что такое "один ко многим".
Это отношение.

> А что такое DDL
Data definition language

> Мы такого не проходили
В каком полку служили?


 
parovoZZ ©   (2006-01-09 16:20) [6]

Супер, с задачкой разобрался. НО

А чем же тогда отличается внешнее связывание от внутреннего? Можете привести пример что может первое и что не может второе?

И всё-таки для чего связывают таблицы при их создании (DataBase Desctop или MSaccess), если они прекрасно связываются при SQL-запросах ?

RTFM  ..... это что ещё за зверь.....


 
Fay ©   (2006-01-09 16:35) [7]

2 parovoZZ ©   (09.01.06 16:20) [6]
> RTFM  ..... это что ещё за зверь.....
read the f.cking manual

> А чем же тогда отличается внешнее связывание от внутреннего?

RTFM

> И всё-таки для чего связывают таблицы при их создании (DataBase Desctop или MSaccess),
> если они прекрасно связываются при SQL-запросах ?
Бегом в библиотеку!


 
mr.IL ©   (2006-01-09 18:07) [8]

2 parovoZZ А может вам это ваще не надо, а?


 
parovoZZ ©   (2006-01-10 05:52) [9]

Надо, Федя, надо...


 
mr.il ©   (2006-01-10 05:58) [10]

А вы попробуйте это сделать, и увидите результат. Правда я это не делаю.


 
parovoZZ ©   (2006-01-10 10:16) [11]

Ну к примеру, берём MSAccess, делаем две таблицы. В поле тип данных с помощью мастера подстановки ссылаемся на ключевое поле из другой таблицы (отношением один ко многим). Зачем? Если при SQL-запросе мне всё равно приходится эти два поля связывать.


 
Виталий Панасенко   (2006-01-10 10:53) [12]

Ты просто путаешь обеспечение целостности данных, с выборкой данных.
Суть такого завязываения, например № карточки (уникальный) человека в поликлиннике. К этому номеру привязаны: ФИО, Адрес, группы учета(гипертония, сахарный диабет и тд). И есть таблица движений(посещений) поликлинники примерно такого вида: дата посещения, № карточки, врач.
Что бы узнать, кто какого врача посещал(когда) ты и соединяешь в запросе на выборку (select № карточки=№ карточки в движении). И чтобы ты это мог делать даже при изменении № карточки в таблице-справочнике организовывается каскадное обновление/удаление данных..
См. http://ord.com.ru/files/book2/


 
mr.il ©   (2006-01-10 11:00) [13]

Если ты начинающий, то плюнь на локальные БД, возьми нормальный сервер БД и не парь мозги :). Т.к. если ты серьезно хочеш заниматся программированием для БД, то время тебя заставит перейти на клиент-сервер и потом это будет горзадо больнее. Поверь, бизнес-логика расположенная на сервере, гораздо приятнее, чем описание ее в приложении. Это плюс который лежит на поверхности, а плюсов этих туева хуча.

ЗЫЖ Почитай про внешние ключи и ваще про реляционную модель.


 
Ega23 ©   (2006-01-10 11:02) [14]

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


 
msguns ©   (2006-01-10 11:37) [15]

Определение связок
---------------------
"Внутреннее" (этот термин мне кажется не совсем удачным, т.к. совершенно непонятно, внутри ЧЕГО) связывание - это совершенно необходимое средство формализации (описания языком табличных структур) сложных объектов-сущностей, не "укладывающихся" в одну таблицу. Как пример можно привести упомянутую выше лицевую карточку в задачах кадрового учета или в зарплате. Один объект (человек) имеет несколько сложных характеристик, каждая из которых требует как минимум одну собственную таблицу (помесячные начисления-удержания, отметки о приказах о перемещении, информация о льготах и т.д.). Т.е. фактически имеем картотеку, хранящуюся в нескольких (иногда "несколько" исчисляется десятками и даже сотнями) таблицах, логически связанных в одно целое. Если же добавить к этому сложному объекту еще и другие, ссылающиеся на него, например, в ERP-системах, это может быть учет МБП, касса, реализация ГП и пр., то мы получим достаточно сложную, весьма разветвленную сеть ссылок, реализующих "внешнее" связывание.
Обеспечение "прочности" и достоверности всех этих ссылок - одна из наиглавнейший задач любой БД.

Реализация связок.
-------------------
Как упоминалось выше, связки могут быть  "внутренние", т.е. описывающие связи разных характеристик одного объекта-сущности, так и "внешие", главное назначение которых-обеспечить причинно-следственную связь между разнородными объектами.
В нормализованных БД принято связи обоих типов выполнять через уникальные идентификаторы, однозначно указывающие на объект-сущность.
Такой механизм делает независимым хранение  данных об объекте от собственно самих данных, которые могут изменяться со временем. Изменения любых нативных (естественных, натуральных) характеристик-реквизитов в таком объекте никаким образом не повлияют на его "положение" в общей логической модели данных (ибо не изменится его ID,- то, на что указывают другие объекты, ссылающиеся на меняющейся объект). Реализовать эти связки, говоря обобщенно, можно двумя способами :
1) Бизнес-логика : ввести  некие правила в саму БД - foreign, master-detail, etc (для SQL-серверных БД сущеситвует еще куча всяких фич типа триггеров, ХП, функции и т.д.). Заданная таким образом связка жестко ограничивает манипуляцию связанными данными, откуда бы ни шла попытка изменения БД.
2) Логика клиента: никаких ограничений непосредственно в БД не вносится и вся логика программируется собственно в программе. При этом другая программа в этой же БД может делать все, что ей "вздумается", игнорируя "логику" первой программы.


 
parovoZZ ©   (2006-01-10 20:27) [16]

Подгоретский говорит, что идти учится конкретно на программиста не стоит. Так что вот так.

А всё выше сказанное пойду сейчас переваривать. Но я от Вас не отстану. Я такой.


 
mr.il ©   (2006-01-11 06:08) [17]

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


 
Fay ©   (2006-01-11 06:51) [18]

Полностью согласен с предыдущим оратором.
1) Азы нужно знать "на зубок".
2) Практику не заменит ничто.



Страницы: 1 вся ветка

Текущий архив: 2006.03.05;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.034 c
2-1140033420
49 Cent
2006-02-15 22:57
2006.03.05
Может ли Dbgrid отображать подтаблицу?


2-1140262804
saintninja
2006-02-18 14:40
2006.03.05
Помогите плизз


15-1139612060
Гаврила
2006-02-11 01:54
2006.03.05
Rouse - поздравлялки :-)


2-1140297348
Alex_C
2006-02-19 00:15
2006.03.05
Перехват нажатия клавиш


1-1138950001
Комбинатор
2006-02-03 10:00
2006.03.05
Ошибка памяти в Win98