Причины не использовать число автопостепенного увеличения для первичного ключа

Похоже, ваша ошибка возникла из-за того, что вы не указали basename для своего маршрута в /app/really_simple_contact_management/urls.py:

router.register(r'people', PersonViewSet)

Из документов :

basename - База для использования в именах URL, которые создаются. Если не задано, базовое имя будет автоматически сгенерировано на основе атрибута набора запросов в наборе, если таковое имеется. Обратите внимание, что если набор представлений не включает атрибут набора запросов, вы должны установить базовое имя при регистрации набора.

blockquote>

Замените строку выше на:

router.register(r'people', PersonViewSet, base_name='people',)

Укажите значимую строку как base_name в соответствии с вашими предпочтениями, и ошибка должна исчезнуть.


Обновление:

Вы вручную создаете и возвращаете set , но функция get_queryset ожидала фактический Django QuerySet .

Вы можете переписать свою функцию, используя оператор __in :

def get_queryset(self):
    user = self.request.user
    allowed_lists = get_objects_for_user(user, ('view_list'), klass=List)
    return Person.objects.filter(member__in=allowed_lists)

17
задан Nick 4 November 2008 в 17:12
поделиться

16 ответов

Автоматический сгенерированный идентификатор может вызвать проблемы в ситуациях, где Вы используете репликацию (поскольку я уверен методы, которые Вы нашли, может!). В этих случаях я обычно выбираю GUID.

, Если Вы вряд ли будете использовать репликацию, затем автопостепенное увеличение, PK будет, скорее всего, работать просто великолепно.

27
ответ дан 30 November 2019 в 10:02
поделиться

Вот вещь с автоматическими целыми числами постепенного увеличения как ключи:

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

Вышеупомянутое является моим решающим фактором, пойти ли с одним методом или другим.

3
ответ дан 30 November 2019 в 10:02
поделиться

Для клиентов полезно смочь предварительно выделить целый набор идентификаторов, чтобы сделать объемную вставку, не имея необходимость затем обновлять их локальные объекты со вставленными идентификаторами. Затем существует целая проблема репликации, как упомянуто Galwegian.

6
ответ дан 30 November 2019 в 10:02
поделиться

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

6
ответ дан 30 November 2019 в 10:02
поделиться

от CodingHorror:

Профессионалы GUID

  • Уникальный через каждую таблицу, каждую базу данных, каждый сервер
  • Позволяют легкое слияние записей от различных баз данных
  • , Позволяет легкое распределение баз данных через несколько серверов
  • , можно генерировать идентификаторы где угодно, вместо того, чтобы иметь необходимость к распространению в прямом и обратном направлениях к базе данных
  • , Большинство сценариев репликации требует столбцов GUID так или иначе

Недостатки GUID

  • , Это - целых в 4 раза большее, чем традиционное 4-байтовое индексное значение; это может иметь серьезную производительность и последствия устройства хранения данных, если Вы не осторожны
  • Громоздкий для отладки (где идентификатор пользователя = '{BAE7DF4-DDF-3RG-5TY3E3RF456AS10}')
  • , сгенерированные GUID должны быть частично последовательными для лучшей производительности (например, newsequentialid () на SQL 2005) и включить использование кластерных индексов

, статья предоставляет много хороших внешних ссылок при принятии решения о GUID по сравнению с Автоматическим Инкрементом. Если я могу, я пойти с GUID.

10
ответ дан 30 November 2019 в 10:02
поделиться

Мой основной вопрос с автопостепенным увеличением ключей - то, что они испытывают недостаток в любом значении

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

3
ответ дан 30 November 2019 в 10:02
поделиться

Нет ничего по сути неправильно с использованием AutoNumber, но существует несколько причин не сделать это. Однако, прокрутка Вашего собственного решения не является лучшей идеей, как dacracot упомянутый. Позвольте мне объяснить.

первая причина не использовать AutoNumber на каждой таблице является Вами, может закончить тем, что объединил записи от нескольких таблиц. Скажите, что у Вас есть таблица Sales Order и некоторый другой вид таблицы порядка, и Вы решаете вытащить некоторые общие данные, и использовать несколько представляют наследование в виде таблицы. Хорошо иметь первичные ключи, которые глобально уникальны. Это подобно тому, какой bobwienholt, сказанный об объединяющихся базах данных, но это может произойти в базе данных.

112-секундный, другие базы данных не используют эту парадигму, и другие парадигмы, такие как последовательности Oracle являются путем лучше. К счастью, возможно подражать последовательностям Oracle с помощью SQL Server. Один способ сделать это должно составить единственную таблицу AutoNumber для Вашей всей базы данных, названной MainSequence, или что бы то ни было. Никакая другая таблица в базе данных не будет использовать автонумерацию, но любого, которому нужен первичный ключ, сгенерированный, автоматически будет использовать MainSequence для получения его. Таким образом, Вы получаете все созданные в производительности, блокировке, потокобезопасности, и т.д. что dacracot говорил о, не имея необходимость создавать ее сами.

Другая опция использует GUID для первичных ключей, но я не рекомендую, чтобы, потому что, даже если Вы уверены, человек (даже разработчик) никогда не собирается читать их, кто-то, вероятно, был, и это твердо. И что еще более важно, вещи неявно бросают к ints очень легко в T-SQL, но могут испытать много затруднений, неявно бросив к GUID. В основном они неудобны.

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

17
ответ дан 30 November 2019 в 10:02
поделиться

Ответ Galwegian не обязательно верен.

MySQL With можно установить ключевое смещение для каждого экземпляра базы данных. При объединении этого с достаточно большим инкрементом, он будет для штрафа. Я уверен, что у других поставщиков были бы своего рода подобные настройки.

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

increment = 2
db1 - offset = 1
db2 - offset = 2

Это означает, что

db1 будет иметь ключи 1, 3, 5, 7....

db2 будет иметь ключи 2, 4, 6, 8....

Поэтому мы не будем иметь, включают столкновения, вставляет.

0
ответ дан 30 November 2019 в 10:02
поделиться

Мой основной вопрос с автопостепенным увеличением ключей - то, что они испытывают недостаток в любом значении.

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

0
ответ дан 30 November 2019 в 10:02
поделиться

Полезная дополнительная льгота использования первичного ключа GUID вместо автоувеличивающего - то, что можно присвоить значение PK для новой строки на стороне клиента (на самом деле, необходимо сделать это в сценарии репликации), экономя Вас стычка получения PK строки, Вы просто прибавили сервер.

Одна из оборотных сторон PK GUID - то, что соединения на поле GUID медленнее (если это недавно не изменилось). Другой позитивный аспект использования GUID - то, что это интересно попытаться объяснить нетехническому менеджеру, почему коллизия GUID довольно маловероятна.

0
ответ дан 30 November 2019 в 10:02
поделиться

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

другой проблемой, упомянутой здесь, является способность создать записи в нескольких местах (как в центральной станции, а также при ноутбуках пользователей перемещения). В этом случае, тем не менее, Вам, вероятно, было бы нужно что-то как "sitecode", который был уникален для каждой установки, которая была снабжена префиксом к каждому идентификатору.

0
ответ дан 30 November 2019 в 10:02
поделиться

Единственная причина, о которой я могу думать, состоит в том, что код был написан, прежде sequences были изобретены, и код забыл нагонять ;)

1
ответ дан 30 November 2019 в 10:02
поделиться

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

1
ответ дан 30 November 2019 в 10:02
поделиться

Я предпочел бы использовать GUID для большинства сценариев, в которых существующий метод сообщения имеет любой смысл мне (репликация, являющаяся возможной). Если бы репликация была проблемой, то такая хранимая процедура должна была бы знать о другом сервере, который должен был бы быть связан для обеспечения ключевой уникальности, которая сделает это очень хрупким и вероятно плохой способ сделать это.
Одна ситуация, где я использую целочисленные первичные ключи, которые НЕ автоувеличивают идентификационные данные, имеет место редко измененных справочных таблиц, которые осуществляют ограничения внешнего ключа, которые будут иметь соответствующее перечисление в использующем данные приложении. В том сценарии я хочу удостовериться, что перечислимое отображение будет корректно между разработкой и развертыванием, особенно если будет несколько серверов напоминания.

1
ответ дан 30 November 2019 в 10:02
поделиться

Используя уникальные идентификаторы позволили бы Вам объединять данные из двух различных баз данных.

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

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

3
ответ дан 30 November 2019 в 10:02
поделиться

Одно преимущество - то, что это может позволить базе данных/SQL быть более межплатформенной. SQL может быть точно тем же на SQL Server, Oracle, и т.д.

2
ответ дан 30 November 2019 в 10:02
поделиться
Другие вопросы по тегам:

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