Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将选项存储为描述性字符串或数字?_Php_Mysql - Fatal编程技术网

Php 将选项存储为描述性字符串或数字?

Php 将选项存储为描述性字符串或数字?,php,mysql,Php,Mysql,在mySQL中存储选项的最佳方式是什么?作为与每个字符串关联的描述性字符串或整数 假设我的UI中有一个问题: 你最喜欢什么口味的冰淇淋 香草 巧克力 草莓 将DB中的字符串作为1、2、3存储在INT1字段中,还是作为字符串香草、巧克力或草莓存储在CHAR字段中更好?我知道INT字段的速度会更快,但可能不会太快,除非有上万行 如果它们存储为字符串,那么我就不需要执行任何额外的PHP代码,而如果它们存储为数字,则必须定义值1=vanilla,等等 关于这一点的普遍共识是什么?使用关系数据库的常用方法

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

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

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

香草 巧克力 草莓 将DB中的字符串作为1、2、3存储在INT1字段中,还是作为字符串香草、巧克力或草莓存储在CHAR字段中更好?我知道INT字段的速度会更快,但可能不会太快,除非有上万行

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


关于这一点的普遍共识是什么?

使用关系数据库的常用方法是制作一个名为icecream_flavor或whatver的新表。然后你可以在以后添加新的口味,你的程序可以在需要时提供所有当前的口味选择。您可以按表ID(即整数)存储选项。

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

假设你的例子,如果你使用实际的单词,并且在六个月内你决定也放入一个大小-单勺,双勺等,你突然有一个问题,因为你认为是唯一的主键突然有多个条目用于每个味道。另一方面,如果你使用数字格式,你可以很容易地拥有你喜欢的任意多的香草,一切都很愉快

在本例中,我还建议将实际主键保留为键,仅此而已。添加另一列,然后添加该列,或者创建一个查找表来存储每个项目的实际属性。如果您使用数字格式,但ID为1,则基本上会遇到与以前相同的问题,请将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
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)

这基本上为您提供了无限数量的选项,添加任何您想要的内容(例如choc芯片条目)只需添加几行数据,而不是表格更改。

如果paddy answer不是选项,则应将值存储为ENUM

而ENUM相当于TINYINT1。 仅当您让用户选择的值已预先固定时,ENUM才是答案,否则您必须编辑该表。但是,如果您使用ENUM MySQL,则在插入和从ENUM中选择时会优化引擎。这是显而易见的选择,例如男性\女性


否则,您的问题的答案是TINYINYT1,这是比CHAR和INT1都快的。如果每个用户都可以通过某个唯一的键(例如电子邮件地址)进行识别,那么您可能会发现您不需要数字id

当你控制选择时,保持味道作为一种味道,这样你就不会得到香草,香草香草等等,这对我来说意味着你储存了真正价值的香草

这样可以避免连接,并使数据库数据在浏览时具有意义

您可以向数据库的Flavor列添加一个索引,这样就可以非常便宜地显示所有喜欢香草的用户


如果您有无限的存储选项,然后,也许您应该使用nosql数据库进行调查

如果您有一组恒定的值,并且您不打算将这些值与数据库中与每种类型冰淇淋相关的其他数据相关联,那么您可以使用MySQL的特殊字段类型

设置数据库,如下所示:

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

您还应该将一些创建的和修改的字段放入每个表中,以便跟踪更改。

行中至少应有一列作为主键/索引运行,可能是自动递增的。这是一种很好的做法,因为它允许您通过引用ID号来编辑任何其他字段。否则,如果您想更改数据库,就必须直接编辑MySQL数据库。嗯,不完全是这样,但你知道我的意思,这允许你唯一地标识行。@Jason,我有一个主列,但这与此无关。我只是想问,存储数据的首选方法是什么。EAV结构可以让您同时执行这两种操作,但这远比您看起来需要的复杂得多。在决定使用哪种方法时,问问自己以后需要做些什么来改变它。如果您使用INT来存储它,那么如果您添加了一种新的风格,您必须更改代码来添加标签。为了简单起见,我会使用字符串,因为您已经有了主键。好的,很酷。是的,我认为字符串可能更有意义,因为它将更容易使用,而且我永远不必查看特定的数字是指巧克力、香草还是草莓。如果我还有10个类似的问题呢。您希望有10个关系表吗?看来我得加入这张桌子了
每当我想检索一些简单的信息时。这不是核心功能,只是将存储在users表中的用户配置文件问题。不,在这种情况下,您可以提供things和things\u选项抱歉,这不是很好的描述。所以,冰淇淋是一种东西,草莓是一种选择。thing_options表将提供一个唯一的键id和一个外键thing_id。然后,您可以拥有用户和thing_选项之间的多对多喜爱的东西。现在,您可以存储关于一个人最喜欢的东西的任意信息。玫瑰上的雨滴,小猫上的胡须,明亮的铜壶和温暖的羊毛手套……让我试着换一种说法。您有一个用户表,其中包含所有用户信息,如姓名、电子邮件、密码等。。。假设我们还想存储一个美国州。您是将状态作为字符串存储在users表中,还是为states创建一个单独的表,然后将其与users表中的state字段相关联?这是一个完全不同的问题。如果它只是美国各州,我可能会用它的通用缩写来存储它,但我会用它作为键输入一个州全名表。这将防止存储无效状态。我在给出这个建议时有点矛盾。我讨厌我被迫在网上进入一个美国州,因为我住在新西兰,我们的地址中没有“州”的概念。我知道你在说什么,但你把它看作一个冰淇淋网站。我发布的问题可能不是很好,但是想象一下,一个用户配置文件页面上有10个选择题。它们不是网站的核心功能,可能永远不会有超过几个选项可供选择。@zen使用我给你的简单数据模型,你几乎可以做任何你喜欢的事情,而不仅仅是冰淇淋:我不知道ENUM。ENUM比CHAR或VARCHAR快得多吗?我问这个问题的原因是,如果我在UI中添加另一个选项,我必须将它添加到ENUM字段中,而对于CHAR或VARCHAR,我不会这样做。@zen你说得对。无论如何,ENUM比CAHR或VARCHAR快得多,因为MySQL实际上不在字段中存储文本值,而只是表示每个字段的数值,例如1表示香草,2表示巧克力等。我认为更新一个字段不会导致很多问题。这基本上就是我所想的。将数据存储为字符串,这样我就不必每次检索简单值时都进行连接。选项的数量也不太可能改变,这就是为什么为每个问题单独设置一个表似乎有些过分。