假设您有一个固定的值列表(字符串):“无”,“Skype”,“ICQ”,“GoogleTalk”,“MSN”等。
用户只能选择其中一个字符串作为主即时消息应用程序。
调用假设表IM
的此字段ContactInformations
。使用SQL表,您将如何为IM
字段建模?解决方案应该让填充列表框的代码从数据库加载可能的选择。当用户做出选择并按下“保存”按钮后,代码应更新IM
字段。
所以,我会做这样的事情:
表ContactInformations
包含IM
类型的字段int
,引用IMListID
字段。
IMListID
是下表的关键:
IMNameList
IMListID int, primary key, not null
text varchar(100)
因此,在创建数据库时,我会将IMList
表中支持的Instant Messaging应用程序的所有名称都插入,我会将IM
字段ContactInformations
置于默认值值0
(“无”)。
填充可能的IM应用程序名称列表很容易(从IMNameList
表中获取),更新不太容易,因为我隐含地假设“无”的键是0,“Skype”是“1,”“ICQ”是2,依此类推,我做了另一个隐含的假设:当用户从列表框中选择“Skype”时,“Skype”的索引为1。
你会如何解决这个问题?
答案 0 :(得分:1)
我不会为IM名称使用ID号。他们自己有足够的身份。这是使用PostgreSQL实现它的一种方法。
CREATE TABLE IMNameList (
IMName VARCHAR(35) PRIMARY KEY
);
insert into IMNameList values
('None'),
('Skype'),
('ICQ'),
('GoogleTalk'),
('MSN');
您还希望IMNameList上有一个INSTEAD OF DELETE触发器(未显示),以防止每个人删除值“None”。 (无论您是否使用ID号,都是如此。如果您使用ID号,则IMName上需要额外的UNIQUE约束。)
CREATE TABLE ContactInformations (
user_id integer primary key, -- references users, not shown
IM VARCHAR(35) NOT NULL DEFAULT 'None'
REFERENCES IMNameList (IMName)
ON UPDATE CASCADE
ON DELETE SET DEFAULT
);
INSERT INTO ContactInformations VALUES
(1, 'Skype'),
(2, 'MSN');
使用ON DELETE SET DEFAULT,您可以从IMNameList中删除行,而无需担心它们是否仍在使用中。基本假设是您不会删除仍然存在的IM平台。
DELETE FROM IMNameList
WHERE IMName = 'MSN';
SELECT *
FROM ContactInformations;
user_id IM
--
1 Skype
2 None
负责数据库方面。在应用程序方面,很容易获得有效的IM平台列表。
SELECT IMName
FROM IMNameList
ORDER BY IMName;
对ContactInformations的更新不需要了解有关IM ID号的任何信息。要将第一个用户的IM从“Skype”更改为“ICQ”,只需
UPDATE ContactInformations
SET IM = 'ICQ'
WHERE user_id = 1
AND IM = 'Skype';
答案 1 :(得分:0)
如果您获取应用程序的名称及其ID,我认为更新表没有任何问题。我唯一要改变的是将“none”作为NULL而不是0。
答案 2 :(得分:0)
这是一个非常常见的场景,应该非常容易实现,我不知道你使用的语言是什么(甚至是网络?)
但通常,列表控件可以是绑定到数据源的数据,您可以指定“文本字段”和“值字段”,您的案例中的值字段将是IM字段,文本字段应该是是IMName,你应该从IM领域的另一个表中加入。
答案 3 :(得分:0)
答案 4 :(得分:0)
使用永远不会被用户更改的预定义类型时,我在我的应用程序中使用枚举。这可确保将正确的整数存储在数据库中。
枚举IMListType { 没有设置, Skype公司, ICQ, MSN, 雅虎 }
答案 5 :(得分:0)
很难确切地说出你的问题是什么。也许是这样:“当我向IMNameList添加新记录时,如何确保我不使用已经使用过的数字?”
如果是这样,您正在寻找IMListID字段的自动递增数字。 This question的措辞与您的完全不同,但接受的答案显示了一种适用于所有数据库平台的方法。