Форум программистов, компьютерный форум, киберфорум
Наши страницы

Microsoft SQL Server

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.77
Zilberman
6 / 6 / 0
Регистрация: 20.12.2010
Сообщений: 191
#1

Как правильно организовать отношение между таблицами(тематика: График работы сотрудника). - SQL Server

27.03.2012, 14:18. Просмотров 3070. Ответов 21
Метки нет (Все метки)

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

Суть:

Есть 2 таблицы

1-я
Personal содержащая: |ID | Name | Speciality | WorkScheduleID |
в которой, по моим предположениям, сущьность "WorkScheduleID" является ссылкой на ИД в другой моей таблице

2-я
WorkSchedule содержащая: | ID | WorkPlan |, где WorkPlan - это datetime

Теперь я ума не приложу как мне связать это все так, чтобы у меня было следующее:

У каждого сотрудника - есть график работы в месяц, и время его труда.

Пример: есть парикмахер Иванова, которая работает 21.03.2012 далее мне надо указать его часы приема с учетом интервала между ними,
равное времени выполнения услуги. В кратце запись выглядела бы так

Фамилия: Иванова
График работы: 21.03.2012 09:00
21.03.2012 09:30
21.03.2012 10:00
27.03.2012 10:30
27.03.2012 11:00
27.03.2012 11:30

Вроде бы все ясно, но вот я не понимаю как сделать взаимоотношения в таблицах БД, чтобы к конкретному парикмахеру
соответсвовало несколько дат. Как!?

Я что-то совсем уже запутался. Блин, зоть приезжай к кому-нибудь за деньги и урок по БД бери. Ну не допираю я в эти взаимосвязи на деле.
В теории все понятно, но стоит начать реализовывать как куча вопросов.


Просьба, кому не сложно, киньте советик!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.03.2012, 14:18
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как правильно организовать отношение между таблицами(тематика: График работы сотрудника). (SQL Server):

Как мне правильно реализовать связь между таблицами - Базы данных
Имеются такая вот схема данных, точнее ее часть (смотрите во вложениях) Не устраивает меня связь заказы - расшифровки. Согласно...

Отношение между таблицами "многие ко многим" - Базы данных
Доброго времени суток! Дано: Таблица "Продукты для рецептов" Ключ - Рецепт Ключ - Продукт - Количество Таблица...

Как создать запрос на создание связи 1:1 между таблицами? - SQL Server
Задание такое, нужно сделать так, чтобы между табл Сотрудник и МатОтветственный была связь 1:1 А между табл МатОтветственный и Партия...

Как правильно организовать БД? - Базы данных
Есть база данных о предприятии. В ней есть данные об отделах и о сотрудниках. С сотрудниками всё понятно - сделаю столбец для id отдела, в...

Как грамотно организовать связь между таблицами - MS Access
Здравствуйте, у меня такое задание создать БД в Access. Проблема в том что я не знаю как опимально мэто сделать. База содержит в...

Как организовать класс для работы с несколькими таблицами - Программирование Android
private class DbOpenHelper extends SQLiteOpenHelper{ public DbOpenHelper(Context context, final String DB_NAME,...

21
pincet
1297 / 884 / 106
Регистрация: 23.07.2010
Сообщений: 4,774
27.03.2012, 16:57 #2
Добавь в таблицу WorkSchrdule поле id_personal
0
Zilberman
6 / 6 / 0
Регистрация: 20.12.2010
Сообщений: 191
27.03.2012, 17:55  [ТС] #3
То есть и там и там должна быть ссылка друг на друга. Тоесть отношение многие ко многим?
0
pincet
1297 / 884 / 106
Регистрация: 23.07.2010
Сообщений: 4,774
27.03.2012, 18:17 #4
Нет, из таблицы Сотрудника изыми ссылку на график - получишь 1-n
Хотя лучше всего полностью задачу огласить
0
_katon_
378 / 235 / 10
Регистрация: 03.10.2011
Сообщений: 965
27.03.2012, 18:17 #5
Нужно убрать из таблицы персонала ссылку на график работы. А в таблицу график работы добавить ссылку на персонал. Кроме этого вместо поля WorkPlan можно сделать два поля StartWorkPlan и FinishWorkPlan.
В этом случае при добавлении в график служащего мы будем в таблице WorkSchrdule указывать на него ссылку, дату начала и дату завершения. Связь один ко многим поскольку одному служащему будет соответствовать множество записей в таблице расписания работ.
Что нам это дает:
Фильтруем таблицу WorkSchrdule по полю id_personal и получаем данные о расписании работ только одного служащего. Использование StartWorkPlan и FinishWorkPlan позволит хранить информацию о интервале времени на работу (хотя если интервал времени всегда один и тот же, то можно отказаться)
0
Zilberman
6 / 6 / 0
Регистрация: 20.12.2010
Сообщений: 191
28.03.2012, 15:25  [ТС] #6
Да, в принципе суть не сильно замысловатая. Нужно реализовать возможность при выборе сотрудника в комбобоксе, увидеть его часы приема(ну грубо говоря в чекед лист боксе) и мочь на них записаться(занять), чтобы при последующем выборе, то время что уже занято, выбрать было нельзя.
Ваши рекомендации принял, сейчас буду провобовать.
Со стартом и финишем пока сложно. Мне бы так реализовать

Добавлено через 17 часов 59 минут
Ребят все вроде получилось! Но вот я думаю, а внешнюю таблицу создать для 2 сущностей из разных таблиц, ну для удобства ввода данных и их считывания!?
0
_katon_
378 / 235 / 10
Регистрация: 03.10.2011
Сообщений: 965
28.03.2012, 16:23 #7
Цитата Сообщение от Zilberman Посмотреть сообщение
Ребят все вроде получилось! Но вот я думаю, а внешнюю таблицу создать для 2 сущностей из разных таблиц, ну для удобства ввода данных и их считывания!?
Что сие значит?
0
Zilberman
6 / 6 / 0
Регистрация: 20.12.2010
Сообщений: 191
28.03.2012, 18:31  [ТС] #8
Ну я имел ввиду еще одну таблицу сделать для внешних ключей!? Или туплю!?
Просто я не смог ввести данные в каком то одном месте.
Я задаю параметры ввода в SQL строке, но не могу сообразить как задействовать таблицу WorkShedule

Грубо говоря у меня комбобокс, и дататаймпикер как-то не связываются. Точнее я не знаю как их в запросе связать. Ведь таблице WorkSchedule ссылка имеет int значение.

Примерно моя попытка выглядела так

INSERT WorkPlan INTO WorkSchedule Value (@date) WHERE PersonalID='cmbxPersonal.Text'
Я конечно понимаю что тут надо как-то преобразовать значения, но не знаю, поэтому и думаю на счет 3-й таблицы в который были бы собраны по fk персонал и дата.


Блин пишу наверное бред. Приду домой все конкретно распишу!
0
_katon_
378 / 235 / 10
Регистрация: 03.10.2011
Сообщений: 965
29.03.2012, 10:48 #9
Цитата Сообщение от Zilberman Посмотреть сообщение
Ну я имел ввиду еще одну таблицу сделать для внешних ключей!?
Для внешнего ключа может быть тока одна таблица. (возможно что-то другое имеете в виду)) )
Цитата Сообщение от Zilberman Посмотреть сообщение
Просто я не смог ввести данные в каком то одном месте
Так а, что вы пытаетесь даелать? ADO.NET?
Цитата Сообщение от Zilberman Посмотреть сообщение
Я задаю параметры ввода в SQL строке, но не могу сообразить как задействовать таблицу WorkShedule
Вы имеете ввиду что пытаетесь сконфигурировать строку запроса в коде, но не знаете как правильно написать запрос?
Цитата Сообщение от Zilberman Посмотреть сообщение
Грубо говоря у меня комбобокс, и дататаймпикер как-то не связываются
Вот этот откровенно говоря я совсем не понимаю! Нужны подробности!
Цитата Сообщение от Zilberman Посмотреть сообщение
SQL
1
INSERT WorkPlan INTO WorkSchedule VALUE (@DATE) WHERE PersonalID='cmbxPersonal.Text'
Запрос написан неправильно.
1. Потому что надо так
INSERT INTO WorkSchedule (перечисляем здесь поля таблицы)
VALUES (перечисляем здесь значения для вставки)
2. Вот это здесь не катит - WHERE PersonalID='cmbxPersonal.Text' покскольку добавляем через VALUES
3. Если у вас комбобокс связан с источником данных и настроен на работу с ним, то тогда значение надо брать не из поля Text, а из поля Value.
0
Zilberman
6 / 6 / 0
Регистрация: 20.12.2010
Сообщений: 191
31.03.2012, 16:34  [ТС] #10
Итак, попытаюсь объяснить, что конкретно мне непонятно в этом вопросе. И почему у меня работа со связанными таблицами вызывает такое непонимание. Постараюсь лаконичнее объяснить.

1. У меня есть форма в которой я формирую график работы.
На ней расположены 1 Комбобокс и 1 дататаймпикер
Задачи контролов: в комбобоксе у меня подтянуты сотрудники (парикмахеры, массажисты, маникюршицы и т.д. по фамилиям не по специальностям). В дататаймпикер, дату которую я хочу выбрать и для установления рабочего дня(дней), конкретной фамилии(сотруднику).
Действие: Открываем комбобокс, выбираем Иванову Светлану, далее открываем датапикер, выбираем дату тыкаем, открываем опять, опять тыкаем, и так тыкаем в разные даты столько раз, сколько Иванова должна быть по графику на работе.

Тем временем, как я понимаю инфа будет писаться в таблицу WorkShedule, поле WorkPlan, c ссылкой на IDСотрудника Ивановой.

Вот это я не знаю как написать в запросе!!!
0
_katon_
378 / 235 / 10
Регистрация: 03.10.2011
Сообщений: 965
31.03.2012, 16:44 #11
Запрос для сохранения данных в таблице должен выглядеть следующим образом:
INSERT INTO WorkSchedule (WorkPlan, IDСотрудника)
VALUES (Значение_из_контрола_с_датой, Значение_из_контрола_с_сотрудником)
0
Zilberman
6 / 6 / 0
Регистрация: 20.12.2010
Сообщений: 191
31.03.2012, 17:33  [ТС] #12
Пробую....

Добавлено через 21 минуту
предварительный вопрос, а IDСотрудника не будет конфликтовать с Текстовым значением Значение_из_контрола_с_сотрудником

Добавлено через 26 минут
Ну вот как и ожидалось!

Эксепшен: Конфликт типов операндов Text несовместим с Int
0
_katon_
378 / 235 / 10
Регистрация: 03.10.2011
Сообщений: 965
31.03.2012, 22:44 #13
Так все правильно! У вас же вопрос был относительно запроса!!! А тему извлечения данных из контролов я даже не поднимал, потому, что нет информации. У вас не с запросом проблемы, а с извлечением данных и последующей генерацией его (запроса). К тому же вы еще и не сказали на каком языке кодируете (под какой платформой).
1
Zilberman
6 / 6 / 0
Регистрация: 20.12.2010
Сообщений: 191
31.03.2012, 23:59  [ТС] #14
Пишу на С# MS-SQL, но думаю что для SQL строки это не критично.
Смотрите, мне же нужно внести данные в БД это первая задача, я сейчас не говорю о выборке из таблицы.
Вы мне дали правильны ответ с точки зрения моего вопроса, но вот конструкция ошибочна.
Вот я не понимаю как ввести данные в таблицу, поэтому вводил в SQl команду конструкцию WHERE, но синтаксически она у меня не верна. Поэтому и спрашиваю как сдлать ее правильной.
0
_katon_
378 / 235 / 10
Регистрация: 03.10.2011
Сообщений: 965
01.04.2012, 00:30 #15
Конструкция абсолютно точная. глянуть можно здесь - http://msdn.microsoft.com/ru-ru/library/ms174335.aspx.

Думаю проблема в том, что вы не показываете:
1. Как осуществляться настройка подключения к SQL-server;
2. Как осуществляется "сборка" строки запроса;
3. Как осуществляется выполнение запроса.

Нужен код, чтобы я или кто-то, кто достаточно хорошо разбирается в ado.net, смог вам помочь. При этом возможно вопросы снимутся сами собой если вы прочитаете все закрепленные темы на ветке http://www.cyberforum.ru/ado-net/

Я хорошо понял, что вы хотите сделать на уровне объектов базы данных, а вот с клиентской частью вам скорее всего придется объяснять все заново.
0
01.04.2012, 00:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.04.2012, 00:30
Привет! Вот еще темы с ответами:

Отношение между таблицами - C#
Привет всем. Такой вопрос. Хочу создать отношение между двумя таблицами по foreign key. К примеру таблицы: CREATE TABLE . ( ...

Отношение между таблицами - Delphi БД
Всем привет!! Я столкнулся с такой проблемой.. У меня есть таблица главная и несколько дочерних. Не хочется связывать их в Delphi. Таблицы...

Отношение между несколькими таблицами - C#
Привет всем. Тема в принципе похожа на предыдущую, но все же отличается. Итак, есть три таблицы - Data, History, TypeHistory. Data,...

Отношение между двумя таблицами - C#
Привет всем. Есть две таблицы - Card и Pooshren. У Card есть первичный ключ(столбец itemperson). У pooshren есть столбец itemparent - это...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru