Какова цель DataRelation в DataSet? - PullRequest
2 голосов
/ 26 августа 2009

Программа на C #, над которой я работаю, должна будет экспортировать данные в одну или несколько таблиц данных. Некоторые столбцы этих таблиц будут связаны друг с другом, так что столбец идентификатора одной таблицы может быть ссылкой на ячейку другой таблицы. Это похоже на общий случай настройки DataRelation. Но я пытаюсь понять, как эти отношения могут быть использованы позже.

У меня небольшой опыт работы с реляционными базами данных, но немного. Я понимаю запросы SQL и такие вещи, как LEFT-соединение, правое соединение и т. Д. И я проделал некоторую работу в Access, создавая запросы как с графическим интерфейсом, так и вручную. Но я никогда не создавал никаких отношений в самой базе данных. Я попробовал это минуту назад в Access. После создания отношения я попытался добавить две тестовые таблицы в запрос, и соединение было создано автоматически.

Однако, когда я действительно посмотрел на фактический SQL, он действительно включал команду JOIN, которая была получена из отношений. Но это также означает, что запрос вообще не зависел от отношений. Как можно использовать отношения в базе данных, в которой нет редактора запросов с перетаскиванием, например Access?

Единственная причина, по которой я хотел бы создать отношения в базе данных или DataRelation в DataSet, заключается в том, чтобы я мог подразумевать, какие отношения должны существовать, но не обязательно их форсировать?

Ответы [ 4 ]

1 голос
/ 26 августа 2009

DataRelations используются для:

  • Обеспечить ссылочную целостность (нельзя ссылаться на строку, которой нет в родительской таблице)
  • Перемещение по отношениям, например, получение дочерних строк или родительской строки отношения:

    DataRow[] orderRows = customerRow.GetChildRows("Customers_Orders");

  • Создание вычисляемых столбцов с выражениями, которые ссылаются на родительские или дочерние строки

    OrderTotalColumn.Expression = "Sum(Child(Orders_OrderDetails).Quantity * Child(Orders_OrderDetails).UnitPrice)";

DataRelations также используются и в системе привязки Windows Forms

0 голосов
/ 28 августа 2009

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

Как объяснили другие, взаимосвязь связана с данными, а не с диаграммой взаимосвязей красивой сущности, которую вы получаете в конструкторе отношений, и не с простотой использования в сетке запросов Access. Отношение ограничивает значения в поле в одной таблице значениями, извлеченными из столбца другой таблицы.

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

Access по умолчанию также угадывает отношения, используя «AutoJoin», настройку, которой можно управлять в TOOLS | ВАРИАНТЫ | ТАБЛИЦЫ / ЗАПРОСЫ. Вот что такое объяснение:

Выберите для автоматического создания внутреннее соединение между двумя таблицами, которые вы добавляете в дизайн сетки. Очистите, если хотите определить отношения между сами столы Для AutoJoin в каждая таблица должна иметь поле с тем же именем и типом данных и одно из полей соединения должно быть первичный ключ.

В этом случае вы можете получить линии автоматического соединения, даже если отношения не определены.

Также обратите внимание, что если вы создадите псевдоним полей в сохраненном QueryDef, вы можете потерять оба вида автоматических объединений. Мне кажется, что это изменилось в последних версиях Access, но у меня нет времени, чтобы на самом деле это проверить.

0 голосов
/ 26 августа 2009

Иногда Access в конструкторе запросов автоматически объединяет поля двух таблиц, если они имеют одинаковые имена (ID), даже если вы не создали связь.

0 голосов
/ 26 августа 2009

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

Многие БД имеют каскадные обновления и удаляются также при настройке отношений. Они будут автоматически обновлять и / или удалять дочерние отношения, когда вы обновляете / удаляете родителя.

DataRelation работает аналогичным образом в том смысле, что помогает поддерживать отношения на уровне кода ....

Вот ссылка на некоторые основы проектирования баз данных: http://www.sqlteam.com/article/database-design-and-modeling-fundamentals. # 4, 5, 6 и 7 говорят об отношениях.

А вот еще один для получения дополнительной информации: http://www.deeptraining.com/litwin/dbdesign/FundamentalsOfRelationalDatabaseDesign.aspx

Вот учебник по использованию DataRelation, чтобы помочь с отношениями Родитель / Дочерний в коде при использовании DataSet:

http://www.dotnetjohn.com/articles.aspx?articleid=63

А вот MSDN для DataRelation: http://msdn.microsoft.com/en-us/library/system.data.datarelation(VS.80).aspx

...