我的项目是一个用PHP编写的网站。使用mysql数据库的js。
我需要存储一个带有“类别”或“类型”的项目(找不到更好的名称)。每个项目只能有一个类别。
每个类别都有一个php和javascript代码使用的“名称”(一种id),如“hat”。
这些“名称”在php / javascript代码中是硬编码的。它们不是用户定义的。有一个已知的清单。可以使用新版本的应用程序获得新的“名称”,最终可以删除一些。
以下是我考虑的解决方案:
这是我目前正在使用的解决方案。
数据库看起来像这样:
项
类别
下行(对我来说):
数据库看起来像这样:
项
它有利于删除第一个解决方案的双表查询,但数据仍然是重复的,并且对数据库的影响比以往任何时候都多。
数据库看起来像这样:
项
类别名称直接存储在带有索引的“items”表中。在查询视图中,我的印象是索引的行为方式与我之前使用的第二个表的行为相同(优点是只查询一个表和一个索引而不是两个表和两个索引)
在表现和/或可维护性方面,最好的方法是什么?还有另一种更好的方法吗?
有完整性约束会很好,但不是必需的。 (我可以用另一种方式处理这个问题)
我找到了以下主题:php mysql - should i add the field "category-name" to a table or not?,但它是关于多对多关系的,看起来它是一个变量类别列表。所以它并不适用于我的情况。
答案 0 :(得分:0)
取决于,
您将拥有多少个类别,您需要多久更新一次?
我在添加Enum之前采用了这种方法,但是在类中编写了静态方法并在那里存储了有效名称
class Item{
public static function get_categories()
{
// only works in php >=5.4 otherwise use return array('Category1'...);
return [
'Category1' => 'Category1',
'Category2' => 'Category2',
'Category3' => 'Category3'
];
}
}
执行上述操作,您可以通过Item :: get_categories()轻松访问数组,该数据应对应于数据库中ENUM字段中的值。如果需要添加更多类别,请将它们添加到数据库,然后添加到此功能。您可以使用它来验证用户选择并生成javascript选项。
然而!!!!
你提到填充表格的种子,这将无法轻易为你更新你的ENUM。
我使用ENUM,因为
1)。它很容易设置 2)。它比连接两个表稍微容易一些(但是当你学习它们时JOINS是ace) 3)。如果你使用了一个辅助表,你(如你所指出的那样)必须首先从该表中查找值,然后插入,或者如果在下拉列表中使用了该类别,则使用类别ID及其名称来填充下拉列表(我会这样做)
最后的想法
除非您的网站非常繁忙,否则您将大麦的方式(查找表和ENUM)的性能甚至会发现差异。您仍然需要以两种方式更新每个版本的类别表,但使用INSERT语句而不是ALTER TABLE会更容易
无论您选择哪种方式,如果您不喜欢它,更新代码都会非常容易。
希望这有帮助,祝你好运
记住保持简单愚蠢的K.I.S.S