Возможность добавления нескольких значений в одно поле SQL Server

Вкратце вопрос: Как реализовать возможность многоразового использования поля? Например, у меня в БД SQL Server есть несколько полей (фамилия, имя, отчество, email и номер телефона), не могу понять, как можно для одного пользователя добавить возможность использования поля номер телефона и email не однократно, а несколько раз, как в контактах на телефоне, если захотел, то добавил ещё один номер. Нужно использовать инструкцию INSERT или какие-то другие решения?


Ответы (2 шт):

Автор решения: VladD

Раз вы хотите использовать поиск, по идее ваши таблицы должны выглядеть как-то так:

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 Иннокентий

(Насчёт оптимальности SQL не уверен, я ненастоящий сварщик.)

→ Ссылка
Автор решения: Alexander Petrov

Я любитель собирать разные способы сделать что-либо. И у меня есть чем поделиться.

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

    Например, в книге Кена Хендерсона "Профессиональное руководство по Transact-SQL" такой подход описан в главе 10. Массивы. Но там прямо сказано, что это нарушает правила нормализации. И сейчас лучше так не делать.

  2. Во многих современных РСУБД есть возможность использования XML или JSON. SQL Server умеет работать и с тем, и с другим. Причём для этих типов данных можно применять поиск, схему, индексы, что делает их использование намного удобнее в сравнении с первым способом.

  3. Использовать дополнительную таблицу. То, что описано в соседнем ответе. В первую очередь следует смотреть на этот способ. И лишь если возникает необходимость хранения данных, типы и количество которых неизвестны заранее, следует прибегать к JSON.

→ Ссылка