Можно ли создать таблицу sqlite со столбцом, имеющим несколько значений? - PullRequest
0 голосов
/ 22 ноября 2011

Например, предположим, у меня есть таблица со списком сотрудников.Идентификатор сотрудника является первичным ключом, у меня есть другие данные о сотрудниках, такие как имя, возраст и т.д.Таким образом, он становится многозначным атрибутом.Мы не знаем, сколько телефонов (контактных номеров) у сотрудников.

Возможно ли иметь многозначный атрибут в sqlite3?Или есть какой-нибудь способ приспособиться к этому?

Спасибо.

Ответы [ 4 ]

2 голосов
/ 22 ноября 2011

Вы можете сделать это с помощью следующих идей:

  1. создать 1 столбец для хранения всех телефонных номеров (что затрудняет запросы на основе номеров, не рекомендуется)
  2. вы можете создать xстолбцы для каждого номера (phone1, phone2, ...) (вам нужно решить, какое максимальное количество телефонных номеров будет для каждого пользователя)
  3. Вы можете создать отдельную таблицу для телефонных номеров и связать эту таблицус таблицей сотрудников с внешним ключом .Это позволяет хранить различные списки телефонных номеров для каждого сотрудника (требуется новая таблица).

Вариант 3 представляется наиболее гибким, однако в большинстве случаев, как я видел, был реализован вариант 2 (обычно люди имеют ограниченное количество телефонных номеров).

0 голосов
/ 22 февраля 2017

Многозначные поля считаются очень плохой практикой в ​​DB Design, поскольку они показывают отсутствие «нормальной формы».Вместо этого вы должны:

  1. Создать новую таблицу EmployeePhoneNumber с 3 столбцами.EmployeePhoneNumberId, EmployeeId, PhoneNumber и PhoneType.
  2. Добавить ограничение, чтобы ограничить столбец Тип одним из (Mobile, Home ..).

Теперь вы можете добавить любое количество телефонных номеров по типу в новую таблицу.запросите его по employeeId и введите, если необходимо.

Эта опция не только более гибкая, но и сохранит размер хранилища в БД, поскольку вы будете выделять память только для существующих телефонных номеров.

0 голосов
/ 23 ноября 2011

Это неправильный подход в терминах реляционных баз данных. Вместо этого вы должны создать отдельную таблицу для хранения телефонных номеров сотрудников. В таблице будут столбцы employee_id и phone_number. Каждый сотрудник может иметь 0 или более записей в этой таблице, в зависимости от того, сколько телефонных номеров у вас есть в файле.

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

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

0 голосов
/ 23 ноября 2011

Вы также можете создать сериализуемый пользовательский класс для хранения нескольких контактных номеров.Затем вы можете сериализовать пользовательский класс в byte [] и затем извлечь строку ASCII из байта [].Вы сможете сохранить эту строку из нескольких контактных номеров, но вам придется десериализовать данные после их считывания из базы данных (в обратном порядке).

public class Contacts : ISerializable
{
}

if (Contacts is ISerializable)
{
    string contactNumbers = String.Empty;

    using (var stream = new MemoryStream())
    {
        var formatter = new BinaryFormatter();
        formatter.Serialize(stream, Contacts);
        stream.Close();
        var bytes = stream.GetBuffer();
        contactNumbers = System.Text.Encoding.ASCII.GetString(bytes));
    }

     //Perform the update for this column or add to your insert query.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...