Вопрос типа данных SQL - PullRequest
       1

Вопрос типа данных SQL

4 голосов
/ 30 декабря 2010

У меня возникли проблемы с выбором подходящего типа данных для атрибута в простой базе данных Oracle SQL.

Вот моя ситуация, у меня есть две таблицы - Клиент и Агент. Один из атрибутов в моей таблице агентов называется Подписанные клиенты, мне нужно, чтобы он содержал набор целых чисел (номеров клиентов) как своего рода массив.

Первичным ключом в Customer является Customer_ID и INT. Имеет отношение к типу «Подписанные клиенты» ??? в таблице агент. Так каким должен быть тип «Подписанные клиенты»?

Любая помощь будет принята с благодарностью.

Ответы [ 4 ]

10 голосов
/ 30 декабря 2010

Вам нужна таблица, которая находится между таблицами CUSTOMER и AGENT, связывая их вместе:

AGENT_CUSTOMERS

  • AGENT_ID (первичный ключ, внешний ключ для AGENT.AGENT_ID)
  • CUSTOMER_ID (первичный ключ, внешний ключ для CUSTOMER.CUSTOMER_ID)

Тип данных, который вы ищете, означает хранение денормализованных данных, что приведет к огромной боли при попытке получить определенные значения клиента.Избавьте себя от головной боли, настроив все правильно.

2 голосов
/ 30 декабря 2010

Если предположить, что клиент может быть подписан не более чем на одного агента, то вам нужен столбец внешнего ключа в таблице клиентов, который указывает на таблицу агентов (вместо того, чтобы указывать от агента к клиенту, как предложил ваш вопрос):

CREATE TABLE agents (
    agent_id int PRIMARY KEY,
    ... more columns ...
);

CREATE TABLE customers (
    customer_id int PRIMARY KEY,
    agent_id int REFERENCES agents,
    ... more columns ...
);

(Если, однако, клиент может быть подписан несколькими агентами, то вам нужен ответ OMG Ponies с таблицей связей. Вам нужно уточнить для себя, что вам нужно.)

0 голосов
/ 16 января 2011

re: «В любом случае вы не можете присоединиться к массиву из одного значения или, по крайней мере, ни в каком виде исполнения». - HLGEM Dec 30 '10 в 18: 11

Я всегда могу присоединиться к разделенному запятыми списку.

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

В SQl 2005 и новее вы можете ПЕРЕКРЫТЬ ПРИМЕНИТЬ эту функцию, чтобы объединить несколько строк (с разделенным запятыми списком в виде одного столбца), чтобы денормализовать это в надлежащий формат.

Я использовал эту функцию для поиска списков свойств (для недвижимости), и в целом она работала достаточно хорошо.

SELECT * FROM PropertyLists CROSS APPLY [OLReweAbf].[dbo].[udfSplit] (PropertyLists.propertyList,',')
WHERE PropertyLists.Area = 104

Функция SQL Split , от herbee:

CREATE FUNCTION [dbo].[udfSplit](@text nvarchar(max), @delimiter char(1) = ‘ ‘)
  RETURNS @Strings TABLE ( position int IDENTITY PRIMARY KEY, value nvarchar(max) )
AS
BEGIN
    DECLARE @index int
    SET @index = -1
    WHILE (LEN(@text) > 0)
    BEGIN
        SET @index = CHARINDEX(@delimiter , @text)
        IF (@index = 0) AND (LEN(@text) > 0)
        BEGIN
            INSERT INTO @Strings VALUES (@text) BREAK
        END
        IF (@index > 1)
        BEGIN
            INSERT INTO @Strings VALUES (LEFT(@text, @index – 1))
            SET @text = RIGHT(@text, (LEN(@text) – @index))
        END
        ELSE
            SET @text = RIGHT(@text, (LEN(@text) – @index))
    END
    RETURN
END
0 голосов
/ 30 декабря 2010

Отношения должны всегда содержать один и тот же тип данных, поэтому у вас нет большого выбора здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...