【发布时间】:2014-10-08 05:53:11
【问题描述】:
我的项目是一个使用 mysql 数据库的 php & js 编写的网站。
我需要存储一个项目及其“类别”或“类型”(找不到更好的名称)。每个项目只能有一个类别。
每个类别都有一个供 php 和 javascript 代码使用的“名称”(一种 id),例如“帽子”。
这些“名称”是硬编码在 php/javascript 代码中的。它们不是用户定义的。有一个已知的名单。应用程序的新版本可以有新的“名称”,最终有些可以被删除。
以下是我考虑过的解决方案:
具有一对多关系的第二个表
这是我目前正在使用的解决方案。
数据库看起来像这样:
项目
- INT id(主要)
- INT category_id(索引)
类别
- INT id(主要)
- VARCHAR 名称(唯一)
缺点(对我而言):
- 我必须将类别存储在数据库中。目前我有一种将我所有的类别添加到数据库中的种子。但是这样数据至少在两个地方(DRY!),每次修改时我都必须更新播种脚本
- 做查询的时候,必须要用两张表,因为php代码只知道“名字”
- 当我插入一条记录时,我必须执行一个子请求以首先从“名称”中找到类别 ID
Mysql 枚举
数据库看起来像这样:
项目
- INT id(主要)
- ENUM 类别(索引)[帽子、衬衫、袜子...]
优点是去掉了第一种方案的双表查询,但是数据还是重复的,对数据库的负担比以往任何时候都大。
items 表中的字符串字段
数据库看起来像这样:
项目
- INT id(主要)
- VARCHAR 类别(索引)
类别名称直接存储在“items”表中,带有索引。从查询视图来看,我的印象是索引的行为方式与我之前使用的第二个表相同(优点是只查询一个表和一个索引,而不是两个表和两个索引)
所以,问题...
就性能和/或可维护性而言,最好的方法是什么?还有其他更好的方法吗?
有完整性约束是好的,但不是必需的。 (我可以用另一种方式解决这个问题)
我找到了以下线程:php mysql - should i add the field "category-name" to a table or not?,但它是关于多对多关系的,看起来它是一个可变的类别列表。所以它并不真正适用于我的情况。
【问题讨论】: