数据库设计;我应该使用数字还是描述性文字?

时间:2013-08-16 10:34:30

标签: database-design

我正在处理一个简单的订单HTML表单,我不确定在数据库中存储它的最佳方法是什么。

假设我有一个表格,我问用户:

“你想怎么命令交付?”

  • 发送给我
  • 以数字方式发送
  • 在商店取货

使用单选按钮,他们可以选择其中一个。我的问题是,如何将其存储在数据库中? value应该是什么?

<input type="radio" name="delivered" id="delivered" value="">

我可以使用描述性文字senddigitallypickup并将其保存为varchar,或者我可以将其另存为int - { {1}},12

使用整数我删除了拼写错误的可能性,甚至可能更快(?)。下行是;我必须记住每个值的含义。 “3 取件数字?”

3 个答案:

答案 0 :(得分:2)

数据库首先应该关心存储数据。数据如何呈现给用户应该只是次要问题。

因此,在您的情况下,将整数与CHECK (field IN (...))约束结合使用(或者如果在DBMS中可用,则可能使用枚举),并确保正确记录每个可能的值。这将有利于数据库级别的完整性和性能(通常更快)。最重要的是,客户端代码可以自然地使用它来区分单选按钮,而不是使用本地定义的整数/枚举值字符串,然后需要将其转换为“DB值”。


之后,您可以考虑是否还需要任何集中存储的与演示相关的数据。例如:

  • 您希望客户能够自动更改单选按钮标签吗?
  • 您想集中实施本地化机制吗?
  • 等等...

在这种情况下,您通常会创建一个额外的“查找”表,列出所有有效的整数值以及必要的任何其他演示数据。然后,“主”表将具有朝向查找表的FOREIGN KEY。

答案 1 :(得分:1)

一个典型的设计是有一个单独的表,DeliveryTypes说,它包含1 = send,2 = digital等的映射。然后,你将有一个从Order表到该表的数字列的外键。因此,您只需在Order表中存储数字,但您不必自己记住映射。

E.g:

CREATE TABLE DeliveryTypes (
    DeliveryTypeID int not null PRIMARY KEY,
    Description varchar(20) not null
)

INSERT INTO DeliveryTypes (DeliveryTypeID,Description) VALUES
(1,'Send'),
(2,'Digital'),
(3,'Pickup')

CREATE TABLE Orders (
    /* Various columns for Orders */
    DeliveryTypeID int not null,
    constraint FK_Orders_DeliveryTypes FOREIGN KEY (DeliveryTypeID)
        references DeliveryTypes (DeliveryTypeID)
)

如果您沿着这条路走下去,请尽量避免创建One True Lookup Table

的冲动

答案 2 :(得分:0)

您可以考虑以下内容。

您可以创建一个Enum,它会提供与您的ID相对应的更具描述性的文字 您还可以使用Id(1,2,3)和Text(物理,拾取)在数据库中创建查找表。

如果您打算对Id进行数据库查询,最好使用查找表选项,因为您可以进行连接并带回有意义的选项而不仅仅是Id。