【问题标题】:SQL data type questionSQL数据类型问题
【发布时间】:2011-06-01 16:34:06
【问题描述】:

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

这是我的情况,我有两张表 - 客户和代理。我的代理表中的一个属性称为签名客户,我需要它来保存一组整数(客户编号)作为一种数组。

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

任何帮助将不胜感激。

【问题讨论】:

  • 你不应该在表列中保存一个数组,这意味着它必须是一个相关的表。
  • 我对“从不”提出异议。如果该表列包含一个嵌套表,那很好。但是,HL,我们都知道这只不过是一张相关的表格,但对 John 来说,这似乎很神奇,而且正是他想要的。

标签: sql database oracle types


【解决方案1】:

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

AGENT_CUSTOMERS

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

您寻求的数据类型意味着存储非规范化的数据,这会使尝试检索特定的客户值非常痛苦。通过正确设置来避免头痛。

【讨论】:

  • 这是一个 1:M 的关系,而不是 M:M。
【解决方案2】:

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

【讨论】:

  • 无论如何,您都不能从单个值加入数组,或者至少不能以任何类型的高性能方式。
【解决方案3】:

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

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 的答案和链接表。您需要自己澄清您需要什么。)

【讨论】:

  • 谢谢,这很有帮助!是的,从客户到代理的关系是多对一的。还有一件事我有点在树林里。我是否明白我不再需要“代理”中的“签名客户”属性?
  • 不,你不再需要那个了。
【解决方案4】:

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

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

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

使用 SQl 2005 和更新版本,您可以交叉应用此函数以连接多行(以逗号分隔的列表作为单列),从而将其反规范化为适当的格式。

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

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

SQL Split Function,作者:赫比:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-22
    • 2011-05-20
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2021-04-24
    相关资源
    最近更新 更多