Как мне организовать таблицу с единым первичным ключом

#sqlite #primary-key #rdbms

Вопрос:

У меня есть 2 набора данных в csv-файле, которые необходимо импортировать в базу данных: Клиенты и доходы.

  • Клиенты таблицы имеют CUSTOMER_ID,…. (другие столбцы)
  • Таблица доходов содержит идентификатор ДОХОДА,идентификатор КЛИЕНТА…. (другие столбцы)

Я не знаю, как мне организовать таблицы и отношения между ними, так как CUSTOMER_ID в клиентах не уникален (есть данные для одного и того же клиента на разные даты, поэтому у него есть что-то вроде этого: Таблица клиентов

То же самое относится и к доходу таблицы — несколько идентификаторов ДОХОДОВ и идентификаторов КЛИЕНТОВ

Должен ли я сделать CUSTOMER_ID как PK или должен создать еще один столбец? Я читал, что PK должен иметь только уникальные значения. Пожалуйста, помогите, я интерн и у меня нет опыта в этом.

Я использую SQLITE

Комментарии:

1. Какова цель клиентов за столом? Таблица с именем Клиенты обычно содержит 1 строку для каждого клиента.

2. Он содержит исторические данные, поэтому каждый раз, когда клиент изменяет свои данные (например, фамилию), добавляется новая строка

3. Затем эту таблицу следует переименовать во что-то вроде Clients_History. Создайте таблицу Клиенты только с 1 строкой для каждого клиента, которая будет содержать уникальный идентификатор клиента и любой другой столбец, содержащий информацию о текущем статусе клиента. Тогда CUSTOMER_ID из Clients_History и Income будут ссылаться на идентификатор клиентов.

4. У меня та же проблема с другими таблицами, которые я хотел связать друг с другом. Должен ли я создать таблицу с именем, например, ДАННЫЕ с ИДЕНТИФИКАТОРОМ ПОЛЬЗОВАТЕЛЯ, ИДЕНТИФИКАТОРОМ ДОХОДА, ИДЕНТИФИКАТОРОМ КРЕДИТА … и т. Д.? и как мне это организовать? все в виде целых чисел дополнительный столбец в виде PK (например, DATA_ID)? Или все как первичные ключи(возможно ли это?) , Если бы это не было PK/FK, я бы не смог установить отношения

Ответ №1:

Первичный ключ уникален по определению; именно это здесь и означает слово «ключ». Таким образом, ваш вопрос действительно становится «нужен ли мне первичный ключ и как бы я его добавил?»

Чтобы ответить на этот вопрос, вам нужно узнать о «нормализации базы данных», которая представляет собой набор правил структурирования данных, гарантирующих, что каждый «факт» сохраняется только один раз. Одна из ключевых идей в этих правилах заключается в определении того, какие столбцы «зависят» от каких других столбцов.

Например, в таблице «Клиенты» у вас, по-видимому, есть данные, которые отличаются в разных строках для одного и того же идентификатора клиента (в стороне: разве это не должен быть идентификатор клиента?) но которые можно каким-то образом отличить. Эти столбцы зависят как от идентификатора пользователя, так и от какого-либо другого столбца (версия? дата?), поэтому естественным первичным ключом является комбинация этих двух столбцов. Первичный ключ с несколькими столбцами вполне допустим, но может быть громоздким для работы, поэтому на практике принято добавлять «суррогатный ключ», который представляет собой произвольный идентификатор для каждой строки в таблице.

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

Как вы заметите, нормализация — это не то, что вы можете выполнять по одной таблице за раз — это влияет на то, как вы называете объекты и какие столбцы создаете, — поэтому вам нужно расширить область действия и спланировать данные, которые вам нужно хранить.

Комментарии:

1. Да, вы прекрасно поняли мой вопрос ! 🙂 У меня разные данные для одного и того же клиента, и у него разная дата, все строки необходимы и должны быть добавлены в таблицу. Но я действительно не понимаю, что вы подразумеваете под суррогатным ключом и как я могу это сделать в sqlite? Вы имеете в виду, что мне нужно добавить еще один столбец (например, Client_tableid)? Если да, я понимаю, что Client_tableid должен быть первичным ключом, а идентификатор клиента (или, лучше, идентификатор клиента) не является ключом? Я пытался это сделать, но, поскольку идентификатор клиента не является ключом, я не могу установить связь между таблицами

2. @Jana Как я уже говорил в последнем абзаце, вы не можете смотреть на одну таблицу за раз, вы должны разработать всю свою схему. Ссылаться на идентификатор клиента из другой таблицы в настоящее время не имеет смысла — каждый раз, когда вы присоединяетесь, вы получаете несколько строк. Вам нужна отдельная таблица, в которой есть по одной строке на идентификатор клиента, и вы должны решить, какие данные туда относятся.