Я знаю, что вы уже получили свой ответ. Я пишу это, только чтобы помочь людям, которые имеют один и тот же вопрос, и ищут эту страницу для ответа. здесь объяснение из 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
, а затем синхронизация этих методов имеет два эффекта:
Рассмотрите таблицу материально-технических ресурсов частей - если бы Вы хотите сохранить уровень материально-технических ресурсов в конце каждого дня затем, составной первичный ключ на part_id и date_of_day был бы прекрасен. Вы могли бы принять решение сделать это уникальным ключом и добавить синтетический первичный ключ, особенно если у Вас есть одна или несколько таблиц, ссылающихся на него с ограничением внешнего ключа, но что в стороне, без проблем.
, Таким образом, нет ничего обязательно неправильно с ним, но как любой другой метод он может использоваться неправильно в качестве в примере Patrick.
Редактирование: вот другой комментарий для добавления.
мне напоминают о чем-то, что я записал только что на предмет того, были ли значения даты в базах данных действительно естественными или синтетическими. Читаемое представление даты как "YYYY-MM-DD" является, конечно, естественным, но внутренне в Oracle это хранится как числовое, которое просто представляет ту конкретную дату/время Oracle. Мы можем выбрать и изменить представление того внутреннего значения в любое время (к различным читаемым форматам, или к другой системе календаря полностью) без внутреннего значения, теряющего его значение как тот конкретная дата и время. Я думаю на той основе, тип данных ДАТЫ находится где-нибудь между естественным и синтетическим.
Я соглашаюсь с ним являющийся частью ключа, но добавил бы, что у Вас должен также быть порядковый номер автопостепенного увеличения быть частью PK, и осуществлять ту любую дату записан в базу данных как UTC, с нисходящими системами, чем преобразование в местное время.
система А, что я работал в решительном, что это будет главная идея сделать, чтобы Oracle инициировала запись к базе данных каждый раз, когда другая таблица была затронута, и заставляют sysdate быть частью первичного ключа без порядкового номера. Только проблема состоит в том, что при выполнении запроса на обновление, который поражает строку несколько раз в секунду, она повреждает первичный ключ на таблице, которая записывает изменение.
если Вы уже решили использовать 'естественный' первичный ключ, то вопрос: дата необходимая часть первичного ключа, или не - профессионалы/недостатки не важны!
Существуют некоторые вопросы, которые я спросил бы об использовании даты как часть первичного ключа.
дата включает часть времени? Это делает вещи хитрыми, потому что время включает часовые пояса и переход на летнее время. Это не изменяет дату/временную стоимость, но может привести к неожиданным результатам с точки зрения сортировки или получения значений, основанных на запросе.
я - крупный сторонник использования суррогатных ключей (т.е. используйте столбец последовательности в качестве первичного ключа), а не естественные ключи (как использование даты).
Небольшой довод "против" был бы то, что это не столь изящный дескриптор как некоторые другие идентификаторы
(например, говорящий коллеге может, Вы посмотреть на рекордные 475663 немного легче, чем высказывание можете Вы смотреть 04.12.2008 19:34:02)
существует также риск беспорядка по другому формату даты в различных локалях
(например, 4-го марта 2008 - 03.04.2008 в Европе, 04.03.2008 в США)
(Мое предпочтение состоит в том, чтобы всегда использовать отдельный столбец ключа)
Как всегда.. Это зависит.
, Что Ваша цель включения является датой/столбцом времени в PK? Это должно предоставить дополнительную информацию о записи, не имея необходимость на самом деле выбирать строку?
основной проблемой, которую я могу предвидеть здесь, являются очевидные, т.е. Вы используете дату UTC или локальную дату? Дата будет неправильно истолкована (кто-то будет думать, что это означает местное время, когда это означает UTC)? Поскольку некоторые из других предположили, что это могло бы лучше использоваться в суррогате/составном ключе вместо этого? Для Вашей производительности могло бы быть лучше использовать его в ключе или индексе кроме Первичного ключа.
[Примечание стороны] Это отчасти напоминает мне о теории позади (1) РАСЧЕСКА (объединил GUID), хотя идея здесь состояла в том, чтобы создать уникальный идентификатор для PK, какой SQL Server лучше индексировал/требовал меньше индексного восстановления, вместо того, чтобы добавить любую значимую дату/временную стоимость к строке.
(1) [ http://www.informit.com/articles/article.aspx?p=25862&seqNum=7]
Даты делают совершенно хорошие первичные ключи, при условии, что они имеют смысл как часть естественного ключа. Я использовал бы дату в таблицах как:
(Какова была бы точка добавления суррогата employee_salary_id выше?)
Для некоторых таблиц, дата могла использоваться, но что-то еще имеет больше смысла как первичный ключ, например:
Мы, возможно, использовали (room_no, booking_from_date) или (room_no, booking_to_date), но ссылка более полезна для общения с клиентом и т.д. Мы могли бы превращать их в ограничения UNIQUE, но на самом деле нам нужно более сложное "никакое перекрытие" проверка на них.
Дата как единственный или первый компонент первичного ключа вызывает проблемы производительности на таблицах с высокой вставкой. (Таблица должна будет часто быть перебалансирована).
Часто причины проблема, если больше затем каждый введен на Дату.
В большинстве ситуаций я считаю это неприятным запахом и отговорил бы от него.
Ничто особенно неправильно с этим, но как другие плакаты не отметило, что Вы могли войти в проблемы с часовыми поясами и местными жителями. Также можно закончить с большим количеством ДАТЫ () функции obfusticating SQL.
, Если это - что-то как материально-технические ресурсы в конце дня, так же ранее упомянутого, Вы могли бы, возможно, рассмотреть восемь символьных текстовых полей как "20081202" как вторая часть первичного ключа. Это избегает проблем локали часового пояса и достаточно легко преобразовать в реальную дату, если Вы должны.
Помнят, что первичный ключ имеет две функции к uniquly, определяют запись и осуществлять уникальность. Суррогатные первичные ключи не делают ни одного.
Используя дату, поскольку часть первичного ключа могла сделать соединения на таблице значительно медленнее. Я предпочел бы суррогатный ключ и затем уникальный индекс в день в случае необходимости.