Возможность добавления нескольких значений в одно поле SQL Server
Вкратце вопрос: Как реализовать возможность многоразового использования поля? Например, у меня в БД SQL Server есть несколько полей (фамилия, имя, отчество, email и номер телефона), не могу понять, как можно для одного пользователя добавить возможность использования поля номер телефона и email не однократно, а несколько раз, как в контактах на телефоне, если захотел, то добавил ещё один номер. Нужно использовать инструкцию INSERT или какие-то другие решения?
Ответы (2 шт):
Раз вы хотите использовать поиск, по идее ваши таблицы должны выглядеть как-то так:
CREATE TABLE People
(
Id INT IDENTITY (1, 1) NOT NULL,
Name NVARCHAR(MAX),
CONSTRAINT PK_People_Id PRIMARY KEY (Id)
);
CREATE TABLE Emails
(
Id INT NOT NULL,
PersonId INT NOT NULL,
Email VARCHAR(512),
CONSTRAINT PK_Emails_Id PRIMARY KEY (Id),
CONSTRAINT FK_Emails_People FOREIGN KEY (PersonId)
REFERENCES People (Id)
ON DELETE CASCADE
ON UPDATE CASCADE
);
CREATE TABLE Phones
(
Id INT NOT NULL,
PersonId INT NOT NULL,
Phone VARCHAR(128),
CONSTRAINT PK_Phones_Id PRIMARY KEY (Id),
CONSTRAINT FK_Phones_People FOREIGN KEY (PersonId)
REFERENCES People (Id)
ON DELETE CASCADE
ON UPDATE CASCADE
);
Таким образом, у вас возникают две дополнительные таблицы Emails и Phones, которые могут содержат по нескольку емэйлов/телефонов для каждого человека. Клауза ON DELETE CASCADE нужна для того, чтобы при удалении человека автоматически удалялись и его email'ы/телефоны.
Ваши данные при этом будут выглядеть так:
| Id | Name |
|---|---|
| 1 | Вася |
| 2 | Иннокентий |
| Id | PersonId | |
|---|---|---|
| 10 | 1 | [email protected] |
| 11 | 1 | [email protected] |
| 12 | 1 | [email protected] |
| 13 | 2 | [email protected] |
| 14 | 2 | [email protected] |
(Насчёт оптимальности SQL не уверен, я ненастоящий сварщик.)
Я любитель собирать разные способы сделать что-либо. И у меня есть чем поделиться.
Да, можно хранить несколько значений в одном поле таблицы. Когда-то давно, когда компьютеры были большими, а программы для них маленькими, этот способ реально использовался.
Например, в книге Кена Хендерсона "Профессиональное руководство по Transact-SQL" такой подход описан в главе 10. Массивы. Но там прямо сказано, что это нарушает правила нормализации. И сейчас лучше так не делать.
Во многих современных РСУБД есть возможность использования XML или JSON. SQL Server умеет работать и с тем, и с другим. Причём для этих типов данных можно применять поиск, схему, индексы, что делает их использование намного удобнее в сравнении с первым способом.
Использовать дополнительную таблицу. То, что описано в соседнем ответе. В первую очередь следует смотреть на этот способ. И лишь если возникает необходимость хранения данных, типы и количество которых неизвестны заранее, следует прибегать к JSON.