powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / использование PrimaryKey
41 сообщений из 41, показаны все 2 страниц
использование PrimaryKey
    #32040139
sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проясните, пожалуйста !
У меня в таблице в состав PK должны входить две даты, но по логике работы, таких запросов не существует, т.к. эти даты суть границы диапазона. Если я не буду декларировать наличие PK у таблицы, что я нарушу, или в чем здесь ошибка ?
P.S. Индексы существуют. У значений дат время сброшено в нуль.
...
Рейтинг: 0 / 0
использование PrimaryKey
    #32040140
Фотография AVL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в состав PK входят только эти два поля с датами? или еще что-то?
...
Рейтинг: 0 / 0
использование PrimaryKey
    #32040141
Alexandr Kapustin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Главное, чтобы у таблицы был бы хотя бы один уникальный индекс... Все остальное - от лукавого :)
а обзовете ли вы его РК или нет, дело ваше...
...
Рейтинг: 0 / 0
использование PrimaryKey
    #32040142
Фотография AVL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
физически все работать будет. А вот концептуально... Это называется "слабая сущность" вроде
...
Рейтинг: 0 / 0
использование PrimaryKey
    #32040148
sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to AVL
в состав PK кроме пары дат входят и другие атрибуты.
А чем мне грозит использование "слабой сущности" ?
...
Рейтинг: 0 / 0
использование PrimaryKey
    #32040150
sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вдогонку:
Согласен, что PK - это выбранный из всех возможных. Меня смущает, что Codd, кажется говорил, что для каждого базового отношения PK должен быть выбран.
Или я путаю ?
...
Рейтинг: 0 / 0
использование PrimaryKey
    #32040152
Фотография AVL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
слабая сущность - когда на нее не сделать references, т.е. если на эту таблицу нигде не будет ссылок.
Иногда для обеспечения именно ссылочной целостности применяют суррогатный первичный ключ.
...
Рейтинг: 0 / 0
использование PrimaryKey
    #32040154
Фотография AVL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если эта таблица используется как справочник, то наличие PK обязательно. Иначе - достаточно уникального индекса
...
Рейтинг: 0 / 0
использование PrimaryKey
    #32040163
sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Многострадальная таблица - это так называемая таблица связи "работник" - "бригада":
table kadrdept(idKadr, idDept, dbeg, dEnd),
она хранит принадлежность работника к подразделению предприятия. Ссылки на нее конечно есть. По idKadr и idDept.

1.Правильно ли я понял, что объявлять для этой таблицы
PK as {idKadr, idDept, dbeg, dEnd} не обязательно ?
2. Думаю в данном случае и формирование PK как некий суррогатный ключ также не нужно.
...
Рейтинг: 0 / 0
использование PrimaryKey
    #32040174
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблица без ключа говорит об ошибках проектирования.
Суррогатный ключ дает возможность более быстрого объединения таблиц. В случае наличия суррогатного ключа, в таблице должен быть альтернативный ключ.
...
Рейтинг: 0 / 0
использование PrimaryKey
    #32040180
sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Genady
1. Я считаю также.
2. Следовательно, в таблицу
table kadrdept(idKadr, idDept, dbeg, dEnd) требуется добавить поле idSurrogate ?
...
Рейтинг: 0 / 0
использование PrimaryKey
    #32040183
Фотография AVL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
:) да. и еще уникальный индекс по 4 полям
...
Рейтинг: 0 / 0
использование PrimaryKey
    #32040185
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 sql

Я не могу давать Вам совет добавлять атрибут в отношение или нет, т.к. из Вашего описания трудно понять задачу. Я не знаю что значит у Вас таблица связи, таблица которая обеспечивает отношение многие ко многим?
Что касается суррогатного ключа, то надо изначально решить использовать его или нет и в дальнейшем однообразно проектировать все сущьности.
...
Рейтинг: 0 / 0
использование PrimaryKey
    #32040196
sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Genady
Да, таблица
table kadrdept(idKadr, idDept, dbeg, dEnd)
связана с table kadr(idKadr, ...) как (M:1) и с таблицей
table dept(idDept, ...) как (N:1).
А суррогатные ключи я использую не редко.
Однако, (к моему сожалению) не вижу, чем грозит отказ от объявления PK для таблицы kadrdept ?
...
Рейтинг: 0 / 0
использование PrimaryKey
    #32040213
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В таком случае, для Вашей таблицы РК будет состоять из двух полей idKadr, idDept и дополнительно ничего добавлять не нужно.

А суррогатные ключи я использую не редко.
Суррогатные ключи надо либо использовать либо не использовать. Если используете, то используете во всех таблицах, не забывая определять альтернативные ключи, которые были бы первичными если бы не использовались суррогатные.
...
Рейтинг: 0 / 0
использование PrimaryKey
    #32040215
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И еще один совет - давайте таблицам и столбзам осмысленные названия, это поможет при проектировании и в дальнейшем при сопровождении.

Например, Ваш Dept лучше назвать Department, сущьность должна соответствовать какому то реальному объекту, дав правильное название сущности Вы можете проверить себя, правильно ли эту сущность определили.
...
Рейтинг: 0 / 0
использование PrimaryKey
    #32040217
sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Genady
1. Если использовать только два поля idKadr и idDept, то где хранить "историю данных" ? Например, как отследить изменени численности работников подразделения за период (месяц, квартал, год) ?
2. У меня большинство ключей - суррогатные ключи, но
на чем основано приведенное Вами правило "Суррогатные ключи надо либо использовать либо не использовать." ?
...
Рейтинг: 0 / 0
использование PrimaryKey
    #32040219
Фотография AVL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pk: либо все 4 поля, либо суррогатный
...
Рейтинг: 0 / 0
использование PrimaryKey
    #32040220
Фотография AVL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pk: либо все 4 поля, либо суррогат
...
Рейтинг: 0 / 0
использование PrimaryKey
    #32040221
Фотография AVL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
прошу прощения за повтор - глюки с нашей прокси
...
Рейтинг: 0 / 0
использование PrimaryKey
    #32040226
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Если использовать только два поля idKadr и idDept, то где хранить "историю данных" ? Например, как отследить изменени численности работников подразделения за период (месяц, квартал, год) ?

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

на чем основано приведенное Вами правило "Суррогатные ключи надо либо использовать либо не использовать." ?

Ну скажем так, это не правило а совет, Вам просто будет проще работать с таблицами созданными по одним и тем же правилам.
...
Рейтинг: 0 / 0
использование PrimaryKey
    #32040229
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pk: либо все 4 поля, либо суррогат

Почему?
...
Рейтинг: 0 / 0
использование PrimaryKey
    #32040237
Фотография AVL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сорри. Конечно от постановки задачи зависит :)
...
Рейтинг: 0 / 0
использование PrimaryKey
    #32040241
sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Genady
1. Согласен со всеми Вашими замечаниями (короткие наименования типа "dept" я просто использую для форума).
2. Если мое решение ошибочно (как часть проекта), то рискну предложить вариант:
вместо таблицы kadrdept(idKadr, idDept, dbeg, dEnd)
использовать
новаю таблицу kadrdept(idKadr, idDept, idSurrogate) и
дополнительную таблицу history(idSurrogate, dBeg, dEnd).
При этом нет вопросов о PK.
Это - решение ?
...
Рейтинг: 0 / 0
использование PrimaryKey
    #32040243
Фотография AVL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я бы сделал все в одной таблице, зачем усложнять базу?
...
Рейтинг: 0 / 0
использование PrimaryKey
    #32040248
AAron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А какая необходимость вообще распространять ограничения на даты? Это же интервалы времени. Могут ли они пересекаться? как отслеживается такая ситуация?
может имеет смысл сделать суррогатный ключ и добавить индекс по (idKadr, idDept) и при необходимости на даты
...
Рейтинг: 0 / 0
использование PrimaryKey
    #32040250
sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to AVL
Предложенный вариант усложняет немало, однако в исходном виде в проекте, я согласен с Genady, есть ошибки. И я их не вижу.
...
Рейтинг: 0 / 0
использование PrimaryKey
    #32040254
Фотография AVL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
давайте по порядку: может ли человек работать в бригаде несколько раз?
...
Рейтинг: 0 / 0
использование PrimaryKey
    #32040257
Фотография AVL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может ли он одновременно работать в нескольких бригадах?
...
Рейтинг: 0 / 0
использование PrimaryKey
    #32040259
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
новаю таблицу kadrdept(idKadr, idDept, idSurrogate) и
дополнительную таблицу history(idSurrogate, dBeg, dEnd).


Плохое решение и непонятно чем мотивировано.
Вы или подробно опишите задачу или решайте все сами, с теми данными которые Вы предоставили Вам никто ничего толкового не скажет.
...
Рейтинг: 0 / 0
использование PrimaryKey
    #32040261
sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to AVL
1. Человек в течении месяца может быть переведен в другую бригду неоднократно (более 2-х раз).
2. В каждый момент времени человек может работать только в одной бригаде.
3. Согласованность дат, - требуется только их непересекаемость, отслеживается логикой работы с данными.
...
Рейтинг: 0 / 0
использование PrimaryKey
    #32040262
Фотография AVL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pk: idKadr, idDept, dbeg. Все в одной таблице.
...
Рейтинг: 0 / 0
использование PrimaryKey
    #32040266
sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача такова:
1. Существуют работники.
2. Существуют бригады.
3. В каждый момент времени работник может работать не более чем в одной бригаде, или ни в какой. Момент времени - это дата.
4. В любой момент времени работник может быть переведен в другую бригаду, или перестать работать в какой л.б.

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

Приведенное мной на форуме решение содержит ошибки.
...
Рейтинг: 0 / 0
использование PrimaryKey
    #32040278
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 sql

В Вашем первом варианте, кроме отсутствия РК я ошибок не вижу, вариант РК предложил AVL я с ним согласен. Кроме того, если человек на может работать одновременно в нескольких бригадах я бы добавил еще одно поле CurrentWork которое являлось бы флажком для обозначения того, что запись не является историей.
...
Рейтинг: 0 / 0
использование PrimaryKey
    #32040279
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет снимаю предложение с добавлением поля, для определения исторических записей вполне подойдет dEnd.
...
Рейтинг: 0 / 0
использование PrimaryKey
    #32040283
sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я просто очарован:
обновлення сущность
kadrDepartament(idKadr, idDepartament, dateEnd)
позволяет решить задачу, и, как всякая реляционная
имеет PK as {idKadr, idDepartament, dateEnd}.
Я правильно все понял ?
Если так, то какой бес навеял мне использование именно пары дат ?
...
Рейтинг: 0 / 0
использование PrimaryKey
    #32040286
Фотография AVL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а как же дата начала работы dbeg? уфф... у меня уже брожение мозгов....
...
Рейтинг: 0 / 0
использование PrimaryKey
    #32040294
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kadrDepartament(idKadr, idDepartament, dateBegin, dateEnd)

PK - idKadr, idDepartament, dateBegin
FK - idKadr
FK - idDepartament
...
Рейтинг: 0 / 0
использование PrimaryKey
    #32040301
sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извиняюсь, занесло.
Структура таблицы kadrDept не меняется, но, по условиям задачи (в каждый момент времени работник в одной бригаде) в качестве PK может использоваться набор
{idKadr, idDept, dBeg}.
По-моему, так ?
...
Рейтинг: 0 / 0
использование PrimaryKey
    #32040306
sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Genady, AVL !
Спасибо.
И всем, кто помог.
...
Рейтинг: 0 / 0
использование PrimaryKey
    #32040312
sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу прощения за еще одно послание.
Завтра у меня день рождения, так что неплохой подарочек
приготовили мне рыцари Genady and AVL. Благодарю.
...
Рейтинг: 0 / 0
41 сообщений из 41, показаны все 2 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / использование PrimaryKey
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]