我在为简单的Oracle SQL数据库中的属性选择适当的数据类型时遇到了一些麻烦。
这是我的情况,我有两个表 - 客户和代理。我的Agent表中的一个属性称为Signed Customers,我需要它将一组整数(客户编号)作为一种数组。
Customer中的主键是Customer_ID,是INT。它与“签约客户”类型有关系???在表Agent中。那么“签约客户”的类型应该是什么?
非常感谢任何帮助。
答案 0 :(得分:10)
您需要一个位于CUSTOMER和AGENT表之间的表,将它们链接在一起:
AGENT.AGENT_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)
关系必须始终保持相同的数据类型,因此,您在这里没有太多选择