2014-11-14 3 views
0

Я знаю, что эти вопросы задавались и отвечали несколько раз на всех этих форумах и в Интернете, но я изо всех сил пытаюсь обвести вокруг него голову. У меня возникли проблемы с пониманием того, как отношения работают с первичными и внешними ключами в базе данных SQL. Скажем, у меня есть таблица, называемая «Сотрудники» с ключевым ключом с именем «employeeID», а затем другое имя таблицы «Адреса» с основным ключом с именем «addressID». Я бы создал внешний ключ в таблице «Адреса», называемый «employeeID», а затем создал правильна ли связь между таблицей Employees и таблицей адресов?SQL Database Relationships & VB.Net Application

У меня есть база данных, в которой есть сотрудники, адреса, контакты экстренной помощи и т. Д. ..., где из того, что я прочитал и понял из разных источников, создается правильно. Поэтому в моем приложении vb.net с использованием Azure SQL DB я пытаюсь отобразить в datagridview слова сотрудников и их адреса. Очевидно, что datagridview может отображать информацию только из одной таблицы за раз, поэтому я попытался создать новый набор данных, который бы собирал информацию из двух таблиц и отображал ее как один в представлении gatagrid. Когда представление datagrid отображает эту информацию, все смешано, и отношения не соблюдаются. Для каждой записи в таблице employee она перечисляет каждую запись для каждого человека три раза в таблице адресов. enter image description here

Вот копия кода для Dataset я использую:

Dim connectionstring As String = My.Settings.MacroQualityConnectionString 
    Dim sqlemp As String = "SELECT * FROM Employee_Names, Addresses" 
    Dim connection As New SqlConnection(connectionstring) 
    Dim dataadapter As New SqlDataAdapter(sqlemp, connection) 
    connection.Open() 
    dataadapter.Fill(dsemployees, "Employee_Names") 
    connection.Close() 

    DataGridView1.DataSource = dsemployees.Tables(0) 

Я знаю, это, вероятно, не правильно, но я не уверен, как сделать приложение чтить отношения в базе данных ? В конце концов, мне нужно собрать информацию из нескольких таблиц, чтобы ее можно было правильно отобразить в datagridview, но, к сожалению, мои умения SQL довольно слабы в большинстве моих других навыков! Может быть, большая часть моей проблемы связана с дизайном и настройкой моей БД? Любой вход очень ценится всеми, поскольку я боролся с этим в течение нескольких недель! :(

Спасибо всем заранее

+0

Почему вы используете Cross Join in Select Statement, а не внутреннее соединение ??????? –

+0

Я поставил под вопрос этот вопрос, так как ему лучше в другом месте, так как он спрашивает об отношениях на сервере. – Codexer

+0

Большинство этих таблиц похоже, что они должны быть столбцами на таблице Emp. У сотрудника есть адрес, телефон и т. Д., Поэтому столбцы являются своего рода свойствами. Там, где могут возникнуть отношения PK/FK, есть «Департамент», а Emp принадлежит отделу, а отдел может иметь много emps. Тогда у Emp был бы FK в таблице Dept (не наоборот) – Plutonix

ответ

1

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

SELECT * 
FROM Employee_Names 
INNER JOIN Addresses 
    ON Employee_Names.employeeID = Addresses.employeeID 

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

Что это дает «одна таблица» в том смысле, что результаты - это один набор записей. Однако логично подумать, что бы это означало, если какая-либо запись в таблице Employee_Names содержит более одной связанной записи в таблице Addresses. Сглаживание их в единую таблицу результатов, подобных этому, означало бы наличие дубликатов Employee_Names записей.

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

По существу, вы должны спросить себя, что именно должна представлять запись в DataGridView. В настоящее время он представляет собой уникальную комбинацию Employee_Names и Addresses. Независимо от повторов, он будет показывать каждую комбинацию.

Если вы хотите, чтобы каждая запись представляла уникальную запись Employee_Names, вы не хотели бы выполнять JOIN в запросе вполне так.Вместо этого вы бы хотели использовать это отношение внешнего ключа для указания родительских/дочерних записей и привязать DataGridView к нескольким таблицам (вместо одной таблицы результатов запроса).

У меня нет большого опыта работы с инструментами, но this кажется подходящим местом для начала. Идея состоит в том, что в DataGridView будут отображаться записи из таблицы Employee_Names, и щелчок по области расширения для любой конкретной записи затем отобразит связанные записи из таблицы Addresses в подсетевой сетке.

+0

Это именно то, что мне нужно! Спасибо большое!! Мне определенно нужно прикоснуться к моим навыкам SQL. –