Возьмем эту таблицу в качестве примера:
CREATE TABLE UserServices (
ID BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
Service1 TEXT,
Service2 TEXT,
.
.
.
) ENGINE = MYISAM;
У каждого пользователя будет разное количество услуг, поэтому можно сказать, что таблица начинается с 10 столбцов для сервисов для каждого пользователя. Если у одного пользователя будет 11 служб, должны ли все остальные пользователи иметь 11 столбцов? Теперь, конечно, таблица и строка должны иметь одинаковое количество столбцов, но это просто кажется ужасной тратой памяти. Может быть, лучше использовать другой тип базы данных?
Спасибо!!
Хранение лодок с нулями на самом деле не "потеря памяти", потому что пространство пренебрежимо мало: жесткие диски стоят пенсии за гигабайт, программисты стоят десятки/сотни долларов в час, поэтому экономично сжигать пространство, и это не очень великий аргумент в пользу избегания.
Однако есть лучший аргумент, как говорили другие; базы данных не выполняют переменные числа столбцов для определенного идентификатора в таблице, но они делают переменные числа строк на 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
Как уже отмечалось, это не огромная стоимость, чтобы просто хранить данные по горизонтали, и если вы уверены, что таблица никогда не изменится/не понадобится добавлять новые столбцы на еженедельной основе, чтобы справляться с новыми сервисами и т.д., Тогда это может быть разумная оптимизация разработчика просто иметь столбцы с нулями. Если вы будете регулярно добавлять столбцы или один день иметь тысячи услуг, то вертикальное хранилище должно быть таким, как оно есть
Чтобы немного рассказать о том, что уже было сказано:
Есть ли способ добавить атрибут только к одной строке в SQL?
Нет, и это важно для того, как работают базы данных отношений (SQL), и что в любой версии SQL, будь то mysql, t-sql и т.д. Если у вас есть таблица - и вы хотите добавить атрибут в эту таблицу, это будет другой столбец, и эта колонка будет там для каждой строки. Не только реляционные базы данных - это то, как работают таблицы.
Но это не то, как кто-то это сделает. То, что вы сделали бы, это то, что предложил Алан - отдельная таблица для Сервисов, а затем 3-я таблица (он предложил назвать ее "UserServices"), которая связывает их. И это не одноразовое предложение - это в значительной степени "способ" сделать это. Там нет отходов.
Может быть, лучше использовать другой тип базы данных?
Возможно, если вы хотите что-то с меньшими ограничениями, тогда вы можете пойти с чем-то другим, кроме SQL. Поскольку SQL настолько доминирует, все обычно классифицируется как NOSQL. - Mongo - самая популярная база данных NOSQL, поэтому RC вызвал ее.