Есть ли способ добавить атрибут только в 1 строку в SQL?

0

Возьмем эту таблицу в качестве примера:

CREATE TABLE UserServices (
    ID BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    Service1 TEXT,
    Service2 TEXT,
    .
    .
    . 
) ENGINE = MYISAM;

У каждого пользователя будет разное количество услуг, поэтому можно сказать, что таблица начинается с 10 столбцов для сервисов для каждого пользователя. Если у одного пользователя будет 11 служб, должны ли все остальные пользователи иметь 11 столбцов? Теперь, конечно, таблица и строка должны иметь одинаковое количество столбцов, но это просто кажется ужасной тратой памяти. Может быть, лучше использовать другой тип базы данных?

Спасибо!!

Теги:
database

2 ответа

1
Лучший ответ

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

Однако есть лучший аргумент, как говорили другие; базы данных не выполняют переменные числа столбцов для определенного идентификатора в таблице, но они делают переменные числа строк на ID. Именно так проектируются DB: столбцы фиксированы, строки являются переменными. Все, что делает база данных и предлагает с точки зрения запросов, хранения, поиска, внутреннего проектирования и т.д., Оптимизируется по отношению к этому шаблону

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

Здесь приведен пример:

Table:
ID, ServiceIdentifier, ServiceOwner
1, SV1, John
1, SV2, Sarah
2, SV1, Phil
2, SV2, John
2, SV3, Joe
3, SV2, Mark

SELECT
  ID,
  MAX(CASE WHEN ServiceIdentifier = 'SV1' THEN ServiceOwner END) as SV1_Owner,
  MAX(CASE WHEN ServiceIdentifier = 'SV2' THEN ServiceOwner END) as SV2_Owner,
  MAX(CASE WHEN ServiceIdentifier = 'SV3' THEN ServiceOwner END) as SV3_Owner
FROM
  Table
GROUP BY
  ID


Result:
ID SV1_Owner SV2_Owner SV3_Owner
1  John      Sarah
2  Phil      John      Joe
3            Mark

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

  • 0
    Тем не менее, это все еще глупый способ хранения данных.
1

Чтобы немного рассказать о том, что уже было сказано:

Есть ли способ добавить атрибут только к одной строке в SQL?

Нет, и это важно для того, как работают базы данных отношений (SQL), и что в любой версии SQL, будь то mysql, t-sql и т.д. Если у вас есть таблица - и вы хотите добавить атрибут в эту таблицу, это будет другой столбец, и эта колонка будет там для каждой строки. Не только реляционные базы данных - это то, как работают таблицы.

Но это не то, как кто-то это сделает. То, что вы сделали бы, это то, что предложил Алан - отдельная таблица для Сервисов, а затем 3-я таблица (он предложил назвать ее "UserServices"), которая связывает их. И это не одноразовое предложение - это в значительной степени "способ" сделать это. Там нет отходов.

Может быть, лучше использовать другой тип базы данных?

Возможно, если вы хотите что-то с меньшими ограничениями, тогда вы можете пойти с чем-то другим, кроме SQL. Поскольку SQL настолько доминирует, все обычно классифицируется как NOSQL. - Mongo - самая популярная база данных NOSQL, поэтому RC вызвал ее.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню