Действительно ли это - плохая идея использовать GUID в качестве первичных ключей в SQL MS?

Вот пример моего настраиваемого класса фильтра:

package com.dawson.controller.filter;

import org.springframework.stereotype.Component;
import org.springframework.web.filter.GenericFilterBean;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;


@Component
public class DawsonApiFilter extends GenericFilterBean {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        if (req.getHeader("x-dawson-nonce") == null || req.getHeader("x-dawson-signature") == null) {
            HttpServletResponse httpResponse = (HttpServletResponse) response;
            httpResponse.setContentType("application/json");
            httpResponse.sendError(HttpServletResponse.SC_BAD_REQUEST, "Required headers not specified in the request");
            return;
        }
        chain.doFilter(request, response);
    }
}

И я добавил его в конфигурацию загрузки Spring, добавив его в класс конфигурации следующим образом:

package com.dawson.configuration;

import com.fasterxml.jackson.datatype.hibernate5.Hibernate5Module;
import com.dawson.controller.filter.DawsonApiFilter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;

@SpringBootApplication
public class ApplicationConfiguration {
    @Bean
    public FilterRegistrationBean dawsonApiFilter() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(new DawsonApiFilter());
// In case you want the filter to apply to specific URL patterns only
        registration.addUrlPatterns("/dawson/*");
        return registration;
    }
}
24
задан Fionnuala 27 February 2009 в 16:28
поделиться

12 ответов

Существуют за и против:

Эта статья касается всего.

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

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

Недостатки GUID

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

Я записал сообщение об этом на прошлой неделе с некоторым кодом, чтобы показать Вам, что происходит: Некоторый Простой Код Для Показа Различия Между Newid И Newsequentialid

В основном при использовании newid () вместо Newsequentialid () Вы получаете ужасные расщепления страницы, если Ваш PK является кластерным индексом (которым это будет по умолчанию)

17
ответ дан SQLMenace 16 October 2019 в 07:58
поделиться

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

16
ответ дан Brandon 16 October 2019 в 07:58
поделиться

Это будет плохо, если необходимо будет сделать соединения по большим наборам (скажем, 100 000 тыс). Там, перенес это.

Более позднее Редактирование: Я также встретился, еще худший провал (не может назвать это "подходом"): хранение GUID в символе (36) столбцы!!

4
ответ дан Andrei Rînea 16 October 2019 в 07:58
поделиться

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

, Как был сказан, большая оборотная сторона является расщеплениями страницы, которые произойдут, если Ваш PK будет кластерным индексом; однако, можно решить это двумя путями. Вы могли использовать NewSequentialId (), или можно установить PK, который будет не кластеризироваться. Я рекомендовал бы создать базу данных на основе требований к данным, и если Вам нужен GUID, используют его и затем оптимизируют вокруг него. И проверьте его производительность в своей среде.

3
ответ дан JoshBerke 16 October 2019 в 07:58
поделиться

Jimmy Nilsson написал фантастическую статью о GUID по сравнению с INTs и объединил ГУИДЫ . Заключения... не боятся, что GUID... хорошо составляет гуиды так или иначе.

3
ответ дан Webjedi 16 October 2019 в 07:58
поделиться

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

1
ответ дан bdwakefield 16 October 2019 в 07:58
поделиться

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

0
ответ дан Andrew Hare 16 October 2019 в 07:58
поделиться

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

0
ответ дан Josh Mein 16 October 2019 в 07:58
поделиться

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

0
ответ дан Wayne Molina 16 October 2019 в 07:58
поделиться

При выполнении какого-либо вида репликации баз данных, GUID являются лучшим другом!

-1
ответ дан Rad 16 October 2019 в 07:58
поделиться

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

1
ответ дан user12849 28 November 2019 в 22:32
поделиться
Другие вопросы по тегам:

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