-1

在 mySQL 中存储选项的最佳方式是什么?作为与每个字符串关联的描述性字符串或整数。

假设我的 UI 中有这个问题:

你最喜欢的冰淇淋口味是什么?

  • 香草
  • 巧克力
  • 草莓

将这些在数据库中存储为 INT(1) 字段中的 1、2、3 或 CHAR 字段中的字符串香草、巧克力或草莓是否更好?我知道 INT 字段会更快,但可能不会很快,除非有数万行。

如果它们存储为字符串,那么我不需要做任何额外的 PHP 代码,而如果它们存储为数字,我必须定义 1 = vanilla 的值,等等......

对此的普遍共识是什么?

4

6 回答 6

1

如果您有一组恒定的值,并且您不打算将该值与数据库中的其他数据(与每种类型的冰淇淋相关的信息)相关联,您可以使用 MySQL 的特殊字段类型,称为ENUM

于 2013-10-10T21:13:58.853 回答
1

关系数据库的常用方法是创建一个名为icecream_flavor或其他的新表。然后您可以在以后添加新口味,并且您的程序可以在需要时提供所有当前的口味选择。您可以按表 ID(整数)存储选择。

于 2013-10-10T21:02:48.190 回答
1

如果无法选择稻田答案,则应将值存储为 ENUM。

虽然 ENUM 与 TINYINT(1) 相当。只有当您让用户选择的值已经预先固定时,ENUM 才是答案,否则您将不得不编辑表格。但是如果你使用 ENUM,MySQL 在插入和选择 ENUM 时对引擎进行了优化。这是显而易见的选择,例如 (Male\Female)。

否则,您的问题的答案是 TINYINYT(1),它比 CHAR 和 INT(1) 都快。

于 2013-10-10T21:10:51.677 回答
0

像这样设置你的数据库:

Questions
id, question_text

ex. (1, "What is your favorite ice cream?")

Options
id, question_id, option_text

ex. (1, 1, "Vanilla")

Responses
id, user_id, question_id, option_id

ex. (1, 421, 1, 1)

您还应该在每个表中添加一些created字段modified以跟踪更改。

于 2013-10-10T21:18:18.283 回答
0

我建议您将主索引保留为 int。这样做的最简单的原因是您目前不知道什么,并允许您的数据模型发展。

假设您的示例,如果您使用实际单词,并且在六个月内您决定也输入一个大小 - 单勺,双勺等,您会突然遇到问题,因为您认为唯一的主键突然有多个条目每种口味。另一方面,如果您使用数字格式,您可以轻松拥有任意数量的 Vanilla 变体,一切都很愉快。

在这种情况下,我还建议将实际的主键保留为键,仅此而已。添加另一个具有风味的列,或创建一个查找表来存储每个项目的实际属性。如果您保留数字格式,但将 ID 1 设置为 Vanilla,则基本上会遇到与以前相同的问题,请将 ID 保留为 ID,并将您的详细信息分开。

要保留有关您的项目的数据,您可以使用以下内容:

Master Table
ID     Name
1      Ice Cream

Properties Table
ID     Type
1      Flavour
2      Size

Property Table
ID     PropID    Detail
1      1         Vanilla
2      1         Strawberry
3      2         Single Scoop
4      2         Double Scoop

MasterToProperty
MasterID     Property    PropID
1            1           1
1            2           4

这基本上为您提供了无限数量的选项,并且添加您想要的任何东西(例如巧克力片的条目)只是添加几行数据的问题,而不是表更改。

于 2013-10-10T21:08:56.887 回答
0

如果每个用户都可以通过某个唯一键(例如电子邮件地址)来识别,那么您可能会发现您不需要数字 ID。

当您控制选项时将风味保持为风味(因此您不会得到香草,香草香草等)向我建议您存储实际价值(香草)。

这避免了连接,并使您的数据库数据在您浏览时变得有意义。

您可以在数据库的风味列中添加索引,因此您可以非常便宜地“显示所有喜欢 Vanilla 的用户”。

(如果您可能有无限的存储选项,那么也许您应该使用 nosql 数据库进行调查)

于 2013-10-10T21:12:15.427 回答