SQL Проблема проектирования отношений между таблицами cPK FK - PullRequest
0 голосов
/ 03 апреля 2020

Я новичок в SQL и базах данных, но мне было поручено создать несколько таблиц для хранения информации. У меня возникли проблемы с наилучшим подходом к этому.

Таблица A /* Populated by Flat csv file in SSMS-2016 */

Col1(name), Col2(ArrayX,cPK), Col3(ArrayY,cPK), Col4(subname)
 /* two are required to identify a row. 1,000,000 rows */

Цель: Я хочу добавить описание каждой строки без повторения бесконечного блока текста, где мне может понадобиться 10000 строк, нуждающихся в одном и том же тексте описания.

Пример

**Table A**

Name, ArrayX, ArrayY, Subname
Red,  1, 1, Crayon
Red,  1, 2, Car
Red,  1, 3, Ball
Blue, 2, 1, Ball
Blue, 2, 2, Earth

**Table B**

Name(PK), Descriptions(Text)
Blue, "color, sky, azul, rainbow"
Red, "color, fire, hot, sun, rainbow"
Green, "(null value)"

Я бы хотел, чтобы конечный пользователь мог search

Select *
From Table A 
where Name like %color% AND Subname like %car%`

And SQL returns: `Red, car, "color, fire, hot, sun"`

или

where Name like %rainbow%

И SQL возвращает:

name, subname, table2(descriptions)
Red,  Crayon, "color, fire, hot, sun, rainbow" 
Red,  Car,    "color, fire, hot, sun, rainbow" 
Red,  Ball,   "color, fire, hot, sun, rainbow" 
Blue, Ball    "color, sky, azul, rainbow"
Blue, Earth   "color, sky, azul, rainbow"

Важно, что таблица A Col (Имя) должна вводить описания для всех элементов с тем же значением, которое сохраняет повторение и хранение, необходимое для поля [текст].

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

Update Table B        /* this can be manual as the number of unique items for Table1 Col(Name) is low */
set Description = "color, fire, hot, sun, rainbow"
Name = red

Так что на данный момент, я думаю, что застрял на создание поиска или процедуры, которая дала бы мне соединение, описанное выше. Я знаю, что мне понадобится where table A Name = Table B Name Но я еще не понял этого.

В этом смысл? Должен ли я создать Identity в первой таблице в качестве PK для связи с таблицей B? Если я сделаю это, могу ли я автоматически заполнить таблицу B Col (имя)?

Спасибо, что продвинулись так далеко и на мгновение перешли на псевдокод. У меня новое уважение к разработчикам баз данных!

1 Ответ

0 голосов
/ 03 апреля 2020

Я бы предложил вам выполнить следующие шаги:

  1. В соответствии с нормированным дизайном, TableB должна иметь описания, а не повторять описания в TableA.

  2. Создание представления, объединяющего TableA и TableB на основе имени.

SELECT a.Name, a.ArrayX, a.ArrayY,a.SubName,b.Descriptions
FROM TableA AS a
INNER JOIN TableB AS b
ON a.Name = b.Name;

Создание некластеризованного индекса в столбце Имя для TableA и кластеризованного индекса в столбце Имя в TableB для получения хорошей производительности в JOIN.

Теперь поиск конечного пользователя может быть сверху представления вместо TableA

Как вы сказали, поскольку количество строк в TableB меньше, вы можете напрямую вставлять или обновлять значения цвета в TableB вручную.

...