我在为一个简单的Oracle SQL数据库中的属性选择适当的数据类型时遇到了一些问题。
这是我的情况,我有两个表-- Customer和Agent。我的Agent表中的一个属性称为Signed Customers,我需要它以某种数组的形式保存一组整数(客户编号)。
Customer中的主键是Customer_ID,并且是INT。它与“已签约客户”类型有关?在表Agent中。那么,“签约客户”的类型应该是什么呢?
任何帮助都将不胜感激。
发布于 2010-12-31 03:26:08
假设一个客户最多只能登录到一个代理,那么在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小马的答案和一个链接表。你需要自己弄清楚你需要什么。)
发布于 2010-12-31 02:08:51
您需要一个位于CUSTOMER和AGENT表之间的表,将它们链接在一起:
AGENT_CUSTOMERS
主键,AGENT.AGENT_ID)
CUSTOMER.CUSTOMER_ID)的外键,
您寻找的数据类型意味着存储非正规化数据,这将使尝试检索特定客户值变得非常痛苦。通过正确的设置来省去自己的麻烦。
发布于 2011-01-17 03:55:35
re:“你无论如何都不能从单个值连接到一个数组,或者至少不能以任何类型的性能连接到数组。”- HLGEM Dec 30 '10 at 18:11
我可以而且肯定会一直加入以逗号分隔的列表。
在SQL2000中,他们引入了UDF,我经常使用一个名为Split的函数来获取逗号分隔的列表并将其转换为表。
在SQl 2005和更高版本中,您可以交叉应用此函数,以便联接多行(将逗号分隔的列表作为单个列),以便将其反规范化为适当的格式。
我使用这个功能来查找属性列表(对于房地产),它通常工作得足够好。
SELECT * FROM PropertyLists CROSS APPLY [OLReweAbf].[dbo].[udfSplit] (PropertyLists.propertyList,',')
WHERE PropertyLists.Area = 104SQL 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
ENDhttps://stackoverflow.com/questions/4565027
复制相似问题