Проектирование баз данных - Должно Дата использоваться в качестве части первичного ключа

Я знаю, что вы уже получили свой ответ. Я пишу это, только чтобы помочь людям, которые имеют один и тот же вопрос, и ищут эту страницу для ответа. здесь объяснение из java documentation : Рассмотрим следующий код:

public class SynchronizedCounter {
    private int c = 0;

    public synchronized void increment() {
        c++;
    }

    public synchronized void decrement() {
        c--;
    }

    public synchronized int value() {
        return c;
    }
}

, если count является экземпляром SynchronizedCounter, а затем синхронизация этих методов имеет два эффекта:

  • Во-первых, невозможно, чтобы две вызовы синхронизированных методов на одном и том же объекте чередовали. Когда один поток выполняет синхронизированный метод для объекта, все другие потоки, которые вызывают синхронизированные методы для одного и того же объекта (приостановить выполнение) до тех пор, пока первый поток не будет выполнен с объектом.
  • Во-вторых, когда синхронизированный метод выходит, он автоматически устанавливает связь между событиями и последующим вызовом синхронизированного метода для одного и того же объекта. Это гарантирует, что изменения состояния объекта будут видны для всех потоков.

14
задан rich 4 December 2008 в 15:47
поделиться

10 ответов

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

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

Редактирование: вот другой комментарий для добавления.

мне напоминают о чем-то, что я записал только что на предмет того, были ли значения даты в базах данных действительно естественными или синтетическими. Читаемое представление даты как "YYYY-MM-DD" является, конечно, естественным, но внутренне в Oracle это хранится как числовое, которое просто представляет ту конкретную дату/время Oracle. Мы можем выбрать и изменить представление того внутреннего значения в любое время (к различным читаемым форматам, или к другой системе календаря полностью) без внутреннего значения, теряющего его значение как тот конкретная дата и время. Я думаю на той основе, тип данных ДАТЫ находится где-нибудь между естественным и синтетическим.

9
ответ дан 1 December 2019 в 12:14
поделиться

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

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

4
ответ дан 1 December 2019 в 12:14
поделиться

если Вы уже решили использовать 'естественный' первичный ключ, то вопрос: дата необходимая часть первичного ключа, или не - профессионалы/недостатки не важны!

4
ответ дан 1 December 2019 в 12:14
поделиться

Существуют некоторые вопросы, которые я спросил бы об использовании даты как часть первичного ключа.

дата включает часть времени? Это делает вещи хитрыми, потому что время включает часовые пояса и переход на летнее время. Это не изменяет дату/временную стоимость, но может привести к неожиданным результатам с точки зрения сортировки или получения значений, основанных на запросе.

я - крупный сторонник использования суррогатных ключей (т.е. используйте столбец последовательности в качестве первичного ключа), а не естественные ключи (как использование даты).

3
ответ дан 1 December 2019 в 12:14
поделиться

Небольшой довод "против" был бы то, что это не столь изящный дескриптор как некоторые другие идентификаторы

(например, говорящий коллеге может, Вы посмотреть на рекордные 475663 немного легче, чем высказывание можете Вы смотреть 04.12.2008 19:34:02)

существует также риск беспорядка по другому формату даты в различных локалях

(например, 4-го марта 2008 - 03.04.2008 в Европе, 04.03.2008 в США)

(Мое предпочтение состоит в том, чтобы всегда использовать отдельный столбец ключа)

2
ответ дан 1 December 2019 в 12:14
поделиться

Как всегда.. Это зависит.

, Что Ваша цель включения является датой/столбцом времени в PK? Это должно предоставить дополнительную информацию о записи, не имея необходимость на самом деле выбирать строку?

основной проблемой, которую я могу предвидеть здесь, являются очевидные, т.е. Вы используете дату UTC или локальную дату? Дата будет неправильно истолкована (кто-то будет думать, что это означает местное время, когда это означает UTC)? Поскольку некоторые из других предположили, что это могло бы лучше использоваться в суррогате/составном ключе вместо этого? Для Вашей производительности могло бы быть лучше использовать его в ключе или индексе кроме Первичного ключа.

[Примечание стороны] Это отчасти напоминает мне о теории позади (1) РАСЧЕСКА (объединил GUID), хотя идея здесь состояла в том, чтобы создать уникальный идентификатор для PK, какой SQL Server лучше индексировал/требовал меньше индексного восстановления, вместо того, чтобы добавить любую значимую дату/временную стоимость к строке.

(1) [ http://www.informit.com/articles/article.aspx?p=25862&seqNum=7]

2
ответ дан 1 December 2019 в 12:14
поделиться

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

  • holiday_dates (hol_date дата)
  • employee_salary (employee_id целое число, sal_start_date дата)

(Какова была бы точка добавления суррогата employee_salary_id выше?)

Для некоторых таблиц, дата могла использоваться, но что-то еще имеет больше смысла как первичный ключ, например:

  • hotel_room_booking (booking_reference)

Мы, возможно, использовали (room_no, booking_from_date) или (room_no, booking_to_date), но ссылка более полезна для общения с клиентом и т.д. Мы могли бы превращать их в ограничения UNIQUE, но на самом деле нам нужно более сложное "никакое перекрытие" проверка на них.

2
ответ дан 1 December 2019 в 12:14
поделиться

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

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

В большинстве ситуаций я считаю это неприятным запахом и отговорил бы от него.

0
ответ дан 1 December 2019 в 12:14
поделиться

Ничто особенно неправильно с этим, но как другие плакаты не отметило, что Вы могли войти в проблемы с часовыми поясами и местными жителями. Также можно закончить с большим количеством ДАТЫ () функции obfusticating SQL.

, Если это - что-то как материально-технические ресурсы в конце дня, так же ранее упомянутого, Вы могли бы, возможно, рассмотреть восемь символьных текстовых полей как "20081202" как вторая часть первичного ключа. Это избегает проблем локали часового пояса и достаточно легко преобразовать в реальную дату, если Вы должны.

Помнят, что первичный ключ имеет две функции к uniquly, определяют запись и осуществлять уникальность. Суррогатные первичные ключи не делают ни одного.

0
ответ дан 1 December 2019 в 12:14
поделиться

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

-2
ответ дан 1 December 2019 в 12:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: