SQL数据类型问题

时间:2010-12-30 18:03:35

标签: sql database oracle types

我在为简单的Oracle SQL数据库中的属性选择适当的数据类型时遇到了一些麻烦。

这是我的情况,我有两个表 - 客户和代理。我的Agent表中的一个属性称为Signed Customers,我需要它将一组整数(客户编号)作为一种数组。

Customer中的主键是Customer_ID,是INT。它与“签约客户”类型有关系???在表Agent中。那么“签约客户”的类型应该是什么?

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:10)

您需要一个位于CUSTOMER和AGENT表之间的表,将它们链接在一起:

AGENT_CUSTOMERS

  • AGENT_ID(主键,AGENT.AGENT_ID的外键)
  • CUSTOMER_ID(主键,CUSTOMER.CUSTOMER_ID的外键)

您寻找的数据类型意味着存储非规范化数据,这会导致尝试检索特定客户价值的痛苦。通过正确设置来节省您的头痛。

答案 1 :(得分:2)

假设客户最多只能签署一个代理,那么您需要在customers表中指向代理表的外键列(而不是像代理建议的那样从代理指向客户):

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小马的答案。您需要自己说明您的需求。)

答案 2 :(得分:0)

re:“无论如何,你无法从单个值加入数组,或者至少不能以任何类型的高效方式加入数组。” - HLGEM 2010年12月30日18:11

我可以并且肯定会一直加入逗号分隔列表。

在SQL 2000中,他们引入了UDF,我经常使用一个名为Split的函数来获取逗号分隔列表并将其转换为表格。

使用SQl 2005和更新版本,您可以CROSS APPLY此函数以连接多行(以逗号分隔的列表作为单个列),以便将其反规范化为正确的格式。

我使用此功能查找属性列表(用于房地产),它通常运行良好。

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

SQL Split Function,来自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

答案 3 :(得分:-1)

关系必须始终保持相同的数据类型,因此,您在这里没有太多选择