2012-02-24 2 views
0

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

ответ

1

Его, возможно, вопрос о реализации - так что это зависит от того, какую СУБД вы используете.

Простейший ответ - данные из этой таблицы вышли из кэша СУБД и будут считаны с диска в произвольном порядке, если не указаны с явным оператором ORDER BY.

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

1

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

+0

Я знаю, что это плохая практика, и я никогда этого не сделаю.Но кто-то спросил меня на днях, ПОЧЕМУ данные меняют порядок, и я не знал. – wootscootinboogie

+1

Ну, первичные ключи LINK разные части вместе. Подумайте об этом как о группе вещей, и некоторые из этих материалов связаны со строкой. Вы можете вытащить целую цепочку, так как она подключена. Но отрежьте струну, и материал потеряется. Это важная роль ПК-сохранения целостности данных. – Andrew

3

Я думаю, вы вводите в заблуждение ряд связанных понятий.

Первичный ключ - это концептуальная вещь. Это уникальный идентификатор записи в реляционной базе данных.

Первичные ключи часто реализуются с помощью уникальных индексов. В некоторых системах баз данных вы можете указать их как «сгруппированные»; они влияют на физический порядок данных на диске.

Порядок, в котором данные возвращаются, контролируется, во-первых, по условию «заказать по»; если это не доступно, оно не определено - каждая база данных может свободно реализовать это, как она хочет.

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

+0

«это может быть все, что в кеше запросов», это то, к чему я стремился. какие факторы определяют это? – wootscootinboogie

2

При условии, что вы не заказываете использование ORDER BY, база данных в основном бесплатна для возврата вещей в том порядке, который наиболее удобен для этого.

Некоторые примеры способов его заказа;

  • Результаты возврата в строки заказа были вставлены. Это, скорее всего, будет возвращать строки в том же порядке каждый раз.
  • Возвращает результаты в порядке их появления в индексе. Поскольку индексы могут быть перестроены в любое время некоторыми базами данных, вещи могут не всегда отображаться в том же порядке, особенно после INSERT/UPDATE/DELETE.
  • Сначала возвращайте кешированные результаты, возвращайте результаты, которые он должен читать с диска, когда они появляются. Это приведет к тому, что первые результаты запроса появятся быстро, но результаты будут отображаться в абсолютно непредсказуемом порядке каждый раз, когда вы выполняете запрос.

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

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

+0

все хорошие ответы и все, что я искал. gracias, amigos! – wootscootinboogie

3

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

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

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

Но РСУБД часто предлагают альтернативные стратегии, чтобы сделать то же самое; например, индексированные таблицы, необязательная функция, доступная в Oracle, следует за стратегией сохранения самой таблицы. Это имеет некоторые преимущества и недостатки по сравнению с стратегией по умолчанию (повышает производительность для некоторых видов запросов, но использует больше дискового пространства).

И это, в конце концов, точка систем баз данных: вы определяете схему данных в терминах высокого уровня (таблицы, ключи, ограничения), а РСУБД решает, как организовать данные. Мы даем РСУБД большую свободу в том, как он это делает, потому что мы хотим, чтобы умные люди, которые разрабатывали и внедряли системы баз данных, изобретали новые и лучшие способы сделать то же самое.

Вопрос в том, что происходит, когда данные меняют порядок после запроса? Если кто-то открыл базу данных, закрыл ее и снова открыл, чтобы найти данные в другом порядке, что происходит, когда это происходит?

Ну, во-первых, если вы не скажете базу данных, которую вы хотите результаты запроса в определенном порядке (с ORDER BY), это позволило вернуть результаты в любом порядке его любит.

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

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

+0

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

2

«Но кто-то спросил меня на днях, ПОЧЕМУ данные меняют порядок, и я не знал».

Причина в том, что отсутствие «неотъемлемого» заказа является одним из самых фундаментальных свойств реляционной модели. Множество {1 2} является тем же самым множеством, что и множество {2 1}, а реляционная модель берет свое начало в теории множеств.

Смежные вопросы