Как Вам нравятся Ваши первичные ключи? [закрытый]

Неустранимая ошибка: вызов функции-члена ... на не-объект

происходит с кодом, подобным xyz->method(), где xyz не является объектом и, следовательно, method не может

Это фатальная ошибка, которая остановит сценарий (уведомление о прямой совместимости: это станет захватывающей ошибкой, начиная с PHP 7).

Чаще всего это знак что в коде отсутствуют проверки условий ошибок. Убедитесь, что объект фактически является объектом перед вызовом его методов.

Пример типичного будет

// ... some code using PDO
$statement = $pdo->prepare('invalid query', ...);
$statement->execute(...);

В приведенном выше примере запрос не может и prepare() назначит false на $statement. Попытка вызвать метод execute() приведет к Fatal Error, потому что false является «не объектом», потому что значение является логическим.

Выясните , почему ваша функция вернула логическое значение вместо объекта. Например, проверьте объект $pdo для последней произошедшей ошибки. Подробности о том, как отлаживать это, будут зависеть от того, как обрабатываются ошибки для конкретной рассматриваемой функции / объекта / класса.

Если даже сбой ->prepare не выполняется, то ваш дескриптор

// ... some code using PDO
$statement = $pdo->prepare('invalid query', ...);
$statement->execute(...);

базы данных

// ... some code using PDO
$statement = $pdo->prepare('invalid query', ...);
$statement->execute(...);

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

Другой проблемой может быть условное создание объекта, а затем попытка вызова метода вне этого условного блока. Например,

if ($someCondition) {
    $myObj = new MyObj();
}
// ...
$myObj->someMethod();

Пытаясь выполнить метод вне условного блока, ваш объект не может быть определен.

Вопросы, относящиеся:

85
задан 6 revs, 4 users 61% 19 January 2017 в 12:01
поделиться

26 ответов

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

Автоинкремент ints должен быть Вашим значением по умолчанию, и не , использование их должно быть выровнено по ширине.

72
ответ дан Bramha Ghosh 24 November 2019 в 08:09
поделиться

Это - сложный предмет, поняли ли Вы его или нет. Мог бы подпасть под раздел по этому StackOverflow FAQ.

, Какие вопросы разве я не должен задавать здесь?

Стараются не задавать вопросы, которые субъективны, спорны, или требуют расширенного обсуждения. Это - место для вопросов, на которые можно ответить!

Это было обсуждено в течение многих лет и продолжит обсуждаться в течение многих лет. Единственные подсказки согласия, которое я видел, состоят в том, что ответы несколько предсказуемы в зависимости от того, если Вы спрашиваете парня OO (GUID являются единственным способом пойти!), средство моделирования данных (Естественные ключи являются единственным способом пойти!), или производительность ориентировал DBA (INTs являются единственным способом пойти!).

0
ответ дан 2 revs 24 November 2019 в 08:09
поделиться

Guids.period.

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

<час>

обновление для разъяснения моего оператора.

я работал над большим количеством различных видов сайтов. С маленького единственного сервера имеет дело к большим, поддержанным несколькими DB и веб-серверы. Конечно, были приложения, которые были бы очень хорошо с автоматическим постепенным увеличением ints как первичные ключи. Однако те не соответствуют модели того, как я делаю вещи.

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

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

Несомненно, использование GUID означает, что у Вас должны быть ночью процессы переиндексации. Однако при использовании чего-нибудь кроме автоматического увеличенного INT, необходимо сделать это так или иначе. Heck, даже с INT как основное устройство, вероятно, что у Вас есть другие индексы, для которых нужно повторно созданный для контакта с фрагментацией. Поэтому использование GUID точно не добавляет другую проблему, потому что те задачи должны быть выполнены независимо.

, Если Вы смотрите на объемные приложения там, Вы заметите что-то важное: они все используют закодированные GUID Base64 в качестве ключей. Причина этого проста, использование GUID позволяет Вам масштабироваться легко, тогда как может быть много обручей для перехода через при попытке масштабировать горизонтально INTs.

Наше последнее приложение проходит период тяжелых вставок, который длится приблизительно в течение месяца. После этого 90 + % запросов - все, выбирает для создания отчетов. Для увеличения способности, я могу поднять дополнительные серверы БД во время этого большой период вставки; и позже легко объедините тех в единственный DB для создания отчетов. При попытке сделать это с INTs было бы абсолютным кошмаром.

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

1
ответ дан 2 revs 24 November 2019 в 08:09
поделиться

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

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

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

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

1
ответ дан Walter Mitty 24 November 2019 в 08:09
поделиться

О, еще одна причина, я использую GUID - я использую иерархическую структуру данных. Таким образом, у меня есть таблица 'Company' и таблица 'Vendor', для которой совпадают Первичные ключи. Но у меня также есть таблица 'Manufacturer', которая также 'наследовалась' Компании. Поля, которые характерны для Поставщиков и Производителей, не появляются в тех таблицах - они появляются в Компании. В этой установке, с помощью интервала является намного более болезненным, чем Гуиды. В очень наименьшем, Вы не можете использовать первичные ключи идентификационных данных.

1
ответ дан Michael Bray 24 November 2019 в 08:09
поделиться

Незначительно релевантный, но одна вещь я начал делать недавно, когда у меня есть маленькие таблицы классификации (по существу те, которые представили бы ПЕРЕЧИСЛЕНИЯ в коде), то, что я сделаю первичный ключ символом (3) или символом (4). Тогда я делаю те первичные ключи представителем справочного значения.

, Например, у меня есть система заключения в кавычки для наших внутренних Агентов по продажам. Мы "Стоили Категорий", из которых каждой позиции кавычки присваивают один из... Таким образом, у меня есть таблица поиска типа, названная 'tCostCategories', где первичный ключ является 'MTL', 'SVC', 'TRV', 'НАЛОГОМ', 'ODC'. Другие столбцы в таблице поиска хранят больше деталей, таких как нормальные английские значения кодов, "Материала", "Обслуживания", "Перемещения", "Налогов", "Другие Прямые затраты", и т.д.

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

1 TRV

SVC
3 PartNumber2 MTL
2 OtherPartNumber PartNumber за 150$ за 29,99$ за 40$ намного легче, что использование интервала для представления категорий и затем соединения 1, 2, 3 на всех строках - у Вас есть данные тут же перед Вами, и производительность не кажется затронутой вообще (не, что я действительно протестировал.)

, Насколько реальный вопрос идет... Мне нравится RowGUID uniqueidentifiers. Я не 100% на этом, но не делаю все строки имеют внутренний RowGuid так или иначе?? Если так, затем использование RowGuid на самом деле заняло бы меньше места, чем ints (или что-либо еще в этом отношении.) Все, что я знаю, - то, что, если это достаточно хорошо за M$ для использования в GreatPlains тогда, это достаточно хорошо для меня. (Действительно ли я должен нырнуть??)

1
ответ дан Michael Bray 24 November 2019 в 08:09
поделиться

Почти всегда целые числа.

у Них есть другие серьезные основания помимо того, чтобы быть меньшим/быстрее для обработки. Который Вы записали бы - "404040" или "3463b5a2-a02b-4fd4-aa0f-1d3c0450026c"?

1
ответ дан user42092 24 November 2019 в 08:09
поделиться

Путем я приближаюсь к первичным ключам (и я чувствую, является лучшим), должен постараться не иметь подход "по умолчанию". Это означает вместо того, чтобы просто хлопнуть на целом числе автопостепенного увеличения и прекращении дело, я смотрю на проблему и говорю, "там столбец или группа столбцов, которые всегда будут unqiue и не изменятся?" Если ответ - да тогда, я проявляю тот подход.

1
ответ дан Andrew G. Johnson 24 November 2019 в 08:09
поделиться

Мимо основного определительного ответа, что составляет хороший , первичный ключ оставляют в основном религии и аргументам повреждения помещения. Если у Вас будет что-то то есть, и будет всегда, отображаться исключительно на отдельную строку, то она будет хорошо работать как первичный ключ. Мимо той точки существуют другие соображения:

  • разве определение первичного ключа не чрезмерно сложно? Это старается не представлять ненужную сложность ради следующего "лучшая практика"?
  • там лучший возможный первичный ключ, который потребовал бы, чтобы меньше служебное для базы данных обработало (т.е. Целое ЧИСЛО по сравнению с VARCHAR, и т.д.)?
  • действительно ли я АБСОЛЮТНО уверен, что уникальность и инвариант определенного мыса моего первичного ключа не изменятся?

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

, Надо надеяться, это помогает добавить некоторую ясность...

1
ответ дан Ed Carrel 24 November 2019 в 08:09
поделиться

Я имею, только используют автоинкрементный интервал или GUID. 99% времени у меня есть интервал автоинкремента использования. Это, что мне преподавали использовать, когда я сначала узнал о базах данных и никогда не сталкивался с причиной не использовать их (хотя я знаю о причинах, почему GUID был бы лучше).

мне нравится автоматический инкремент ints, потому что он помогает с удобочитаемостью. Например, я могу сказать, "смотрят на рекордные 129383", и для кого-то довольно легко войти и найти его. С GUID это почти невозможно сделать.

1
ответ дан dtc 24 November 2019 в 08:09
поделиться

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

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

1
ответ дан BIBD 24 November 2019 в 08:09
поделиться

Я всегда использовал суррогатный ключ - целое число автопостепенного увеличения, названное 'идентификатором'. Я вижу много причин сделать это, даже когда другая опция очевидна:

  • Непротиворечивость
  • Информационно-независимый (уникальный, не уничтоженный изменениями в формате)
  • Человекочитаемый

... и никакая разумная причина не к:

  • Неоднозначность в соединениях? - Искажение таблиц является лучшей практикой, по моему скромному мнению
  • таблицы Optimum? - Удаление одного байта за запись является преждевременной оптимизацией, по моему скромному мнению
  • решение На таблицу? - Больше последовательный
  • Масштабирующиеся проблемы? - А? Почему?
  • Иерархическая структура данных? - Это денормализовывает, целый другой предмет религии. Достаточно сказать я - поклонник при нескольких обстоятельствах в теории, но никогда на практике:)

разумные причины против этого я не думал или столкнулся, все же всегда одобрены...

2
ответ дан jTresidder 24 November 2019 в 08:09
поделиться

Столбцы автоприращения. Я в состоянии заставить свой код работать беспрепятственно с SQL Server или Oracle, идентификационные данные использования другие последовательности использования через мой DAL, и я не мог быть более счастливым. Я соглашаюсь, GUID иногда необходимы, если Вы делаете репликацию или отсылаете данные для получения его позже afer обработка.

2
ответ дан Otávio Décio 24 November 2019 в 08:09
поделиться

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

1
ответ дан John Sheehan 24 November 2019 в 08:09
поделиться

должно быть по крайней мере 3 столбца, которые составляют первичный ключ.

я не понимаю это.

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

Международный / BigInt, какой автоинкремент является достаточно хорошими первичными ключами.

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

3
ответ дан ChrisW 24 November 2019 в 08:09
поделиться

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

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

Для контрпримера, человеческие имена обычно делают плохой выбор для первичного ключа. Существуют многие люди, которые идут именем "John Smith" или некоторые другие аналогичные имена; даже принятие во внимание вторых имен (помните: не у всех есть один - например, я не делаю), существует много объема для дублирования. Следовательно, люди не используют имена в качестве первичных ключей. Они изобретают искусственные ключи, такие как Число Номера социального страхования (SSN) или Сотрудника и используют их для обозначения человека.

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

Когда дело доходит до определения первичного ключа данной таблицы, поэтому, необходимо посмотреть на то, что представляет та таблица. Что устанавливает, или наборы значений столбцов в таблице однозначно определяет каждую строку в таблице? Те - ключи-кандидаты. Теперь, если каждый ключ-кандидат состоит из 4 или 5 столбцов, то Вы могли бы решить, что те слишком неуклюжи для создания хорошего первичного ключа (прежде всего, на основании краткости). При тех обстоятельствах Вы могли бы представить суррогатный ключ - искусственно сгенерированное число. Очень часто (но не всегда) простое 32-разрядное целое число достаточно для суррогатного ключа. Вы тогда определяете этот суррогатный ключ как первичный ключ.

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

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

Это - довольно бескомпромиссное представление в некотором отношении.

у меня нет конкретной проблемы с использованием GUID, когда они необходимы, но они имеют тенденцию быть большие (как в 16-64 байтах), и они используются слишком часто. Очень часто совершенно хорошее 4-байтовое значение было бы достаточно. Используя GUID, где 4-байтовое значение удовлетворило бы дисковое пространство отходов и замедляет даже индексный доступ к данным с тех пор, существует меньше значений на индексную страницу, таким образом, индекс будет более глубоким, и больше страниц должно быть прочитано для получения до информации.

56
ответ дан Jonathan Leffler 24 November 2019 в 08:09
поделиться

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

  • Суррогатные ключи полезны, когда никакой другой атрибут или набор атрибутов в таблице не подходят для идентификации строк исключительно.
  • Естественные ключи предпочтены, если это возможно, для создания таблицы более человекочитаемой. Естественные ключи также позволяют внешнему ключу в зависимой таблице содержать действительное значение вместо суррогатного идентификатора. Например, когда необходимо сохранить state (CA, TX, Нью-Йорк), Вы могли бы также использовать char(2) естественный ключ вместо интервала
  • первичные ключи составного объекта Использования в соответствующих случаях. Не добавляйте" id" суррогатный ключ излишне, когда совершенно хороший первичный ключ существует (это особенно верно в many-many таблицах). Мандат для трех столбцов вводит каждую таблицу, абсолютная ерунда.
  • GUID являются решением, когда необходимо сохранить уникальность по нескольким сайтам. Они также удобны, если Вам нужны значения в первичном ключе, чтобы быть уникальными, но не приказанные или последовательными.
  • INT по сравнению с BIGINT: не распространено, что таблица требует 64-разрядный диапазон для первичных ключей, но с увеличивающейся доступностью 64-разрядных аппаратных средств это не должно быть нагрузкой и дает больше обеспечения, что Вы не переполнитесь. INT, конечно, меньше, поэтому если пространство в большом почете, это может дать небольшое преимущество.
24
ответ дан Bill Karwin 24 November 2019 в 08:09
поделиться

GUID РЕ

Предостерегается, если это будет действительно Действительно ДЕЙСТВИТЕЛЬНО ДЕЙСТВИТЕЛЬНО большая база данных, большая загрузка и быстрый доступ.

В моем последнем задании, где у нас были базы данных 100 - 500 миллионов записей, наши парни базы данных сильно привели доводы против GUID, и для соответственно размерного десятичного числа. Они чувствовали, что (под Oracle) различие в размере во внутренней памяти для строкового Гуида - по сравнению с - десятичное значение будет иметь очень заметное значение в поисках. (Большие ключи = более глубокие деревья для пересечения)

случайная природа GUID также уменьшает коэффициент заполнения для индексных страниц значительно - это существенно увеличивает дисковый ввод-вывод и разрыв.

3
ответ дан 2 revs, 2 users 80%John Chenault 24 November 2019 в 08:09
поделиться

Мне нравится блог Программиста баз данных как источник для этого вида информации

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

20
ответ дан duffymo 24 November 2019 в 08:09
поделиться

Я всегда иду с суррогатным ключом. Суррогатный ключ (обычно столбец идентификационных данных, автоинкремент или GUID) является тем, в котором ключ не присутствует в самих данных. Естественный ключ, с другой стороны, является тем, который, самостоятельно, однозначно определяет строку. Почти я могу сказать в жизни, существуют едва любые реальны естественные ключи. Даже вещами как SSN в Соединенных Штатах не является естественный ключ. Составные первичные ключи являются неизбежным бедствием. Вы не можете отредактировать ни одни из тех данных (который является главным недостатком любого естественного ключа, составного объекта или не), но хуже то, что с составным ключом, теперь необходимо увековечить те ключевые данные в каждую связанную таблицу. Какие гигантские отходы.

Теперь, для выбора суррогатного ключа, я придерживаюсь столбцов идентификационных данных (я работаю главным образом в SQL Server MS). GUID является слишком большим, и Microsoft рекомендует против использование их как PK. Если у Вас есть несколько серверов, все, что необходимо сделать, делают инкремент 10 или 20 или независимо от того, что Вы думаете максимальное количество серверов, которые необходимо будет когда-либо синхронизировать/расширять к, и просто inc семя для каждой таблицы на каждом последующем сервере, и у Вас никогда не будет коллизии данных.

, Конечно, из-за инкремента, я делаю столбец идентификационных данных BigInt (иначе известный как длинное [64 бита]).

Выполнение небольшого количества математики даже при создании инкремента 100 Вы можете все еще иметь 92,233,720,368,547,758 (> 92 квадрильона) строки в Вашей таблице.

10
ответ дан Robert C. Barth 24 November 2019 в 08:09
поделиться

Мне нравится мой уникальный.

15
ответ дан Andrew not the Saint 24 November 2019 в 08:09
поделиться

Немного вне темы, но я чувствую себя вынужденным согласиться с...

, Если Ваш первичный ключ является GUID, , не делают , делают его кластерный индекс . Так как GUID непоследовательны, данные будут перестроены на диске почти во время каждой вставки. (Фу). При использовании GUID в качестве первичных ключей они должны не кластеризироваться индексы.

10
ответ дан 2 revs 24 November 2019 в 08:09
поделиться

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

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

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

Cat1.subcatA.record1
Cat1.subcatA.record2
Cat1.subcatB.record1
Cat2.subcatA.record1

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

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

8
ответ дан thursdaysgeek 24 November 2019 в 08:09
поделиться

Я - поклонник автоинкремента как первичный ключ. Я знаю глубоко в моей основе, что это - отговорка, но она действительно делает настолько легким отсортировать данные по тому, когда она была добавлена (идентификатор ORDER BY DESC, f'r экземпляр).

3 столбца звучит ужасно резким для человеческого парсинга.

И это - компромисс - сколько из реляционной возможности делает Вам нужно, по сравнению с созданием ЭТОЙ ТАБЛИЦЫ, ПРЯМО ЗДЕСЬ понятной человеку, опрашивающему его (по сравнению с хранимой процедурой или программируемым интерфейсом).

автоинкремент является для нас людьми.:-(

4
ответ дан Michael Paulukonis 24 November 2019 в 08:09
поделиться

Обычно это зависит.

Лично, мне нравится автоинкремент ints.

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

4
ответ дан BoltBait 24 November 2019 в 08:09
поделиться

Я думаю использование слова "Primary" во фразе, которую "Основной" Ключ находится в реальном смысле, вводя в заблуждение.

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

Затем имение любого ключа служит нескольким часто взаимно непоследовательным целям.

  1. Для использования, как соединяет условия с одной или несколькими записями в дочерних таблицах, которые имеют отношения к этой родительской таблице. (Явно или неявно определение Внешнего ключа в тех дочерних таблицах)
  2. (связанное) Обеспечение, чтобы дочерние записи имели родительскую запись на родительской вкладке; e (Дочерняя таблица FK должен существовать как Ключ в родительской таблице)
  3. Для увеличения perforamce запросов, которые должны быстро определить местоположение определенной записи/строки в таблице.

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

Очевидно, любой немногозначительный, ненатуральный ключ (как GUID или автоматически сгенерированное целое число полностью неспособно к удовлетворяющему № 4.

, Но часто, со многими (большинство) таблицы, полностью естественный ключ, который может обеспечить № 4, будет часто состоять из нескольких атрибутов и будет чрезмерно широк, или так будет широк, что с помощью него в целях № 1, № 2 или № 3 вызовет недопустимую производительность consequencecs.

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

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

9
ответ дан 5 revs, 2 users 94% 24 November 2019 в 08:09
поделиться
Другие вопросы по тегам:

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