具有多个固定值的SQL列字段

时间:2011-06-25 13:38:43

标签: sql database-design

假设您有一个固定的值列表(字符串):“无”,“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。

你会如何解决这个问题?

6 个答案:

答案 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)

您可以使用MySQL ENUM类型。

有关Enum和您的解决方案的比较,请参阅以下主题。

MySQL ENUM type vs join tables

答案 4 :(得分:0)

使用永远不会被用户更改的预定义类型时,我在我的应用程序中使用枚举。这可确保将正确的整数存储在数据库中。

枚举IMListType { 没有设置, Skype公司, ICQ, MSN, 雅虎 }

答案 5 :(得分:0)

很难确切地说出你的问题是什么。也许是这样:“当我向IMNameList添加新记录时,如何确保我不使用已经使用过的数字?”

如果是这样,您正在寻找IMListID字段的自动递增数字。 This question的措辞与您的完全不同,但接受的答案显示了一种适用于所有数据库平台的方法。