2

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

假设我有一个表单,我可以在其中询问用户:

“您希望如何订购?”

  • 把它发给我
  • 以数字方式发送
  • 到店里取

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

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

我可以使用描述性文本send, digitally,pickup并将其另存为 a varchar,或者我可以将其另存为int- 1, 2, 3

使用整数,我消除了拼写错误的可能性,它甚至可能更快(?)。缺点是;我必须记住每个值的含义。“是2 皮卡还是数字?”

4

3 回答 3

3

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

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


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

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

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

于 2013-08-16T11:00:46.667 回答
1

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

例如:

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的冲动

于 2013-08-16T10:38:35.340 回答
0

你可以考虑以下。

您可以创建一个 Enum 来提供与您的 id 相对应的更具描述性的文本。
您还可以使用 Id (1, 2, 3) 和文本 (Physical, Pickup) 在数据库中创建一个查找表。

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

于 2013-08-16T10:40:05.637 回答