Mysql 根据类型合并或分离表

Mysql 根据类型合并或分离表,mysql,database,database-design,Mysql,Database,Database Design,我不知道是应该把两张桌子合起来还是分开 许多表格: 项目:。。。。。。。。。。。。项目ID(主键)。。。。。。。。。。。。。ItemName…….ItemDescription 项目类似:。。。。。ItemLikeID(pk)。。。。。。。项目ID(fk)。。。。。。用户ID(fk) 项目块:。。。ItemBlockID(主键)。。。。项目ID(fk)。。。。。。用户ID(fk) 项目标志:。。。。。。ItemFlagID(主键)。。。。。。项目ID(fk)。。。。。。用户ID(fk) 只有两张

我不知道是应该把两张桌子合起来还是分开

许多表格:

项目:。。。。。。。。。。。。项目ID(主键)。。。。。。。。。。。。。ItemName…….ItemDescription

项目类似:。。。。。ItemLikeID(pk)。。。。。。。项目ID(fk)。。。。。。用户ID(fk)

项目块:。。。ItemBlockID(主键)。。。。项目ID(fk)。。。。。。用户ID(fk)

项目标志:。。。。。。ItemFlagID(主键)。。。。。。项目ID(fk)。。。。。。用户ID(fk)

只有两张表:

项目:。。。。。。。。。。。。。。。。项目ID(主键)。。。。。。。。。。。。。ItemName…….ItemDescription

项目操作:。。。。。ItemActionID(主键)。。。。项目ID(fk)。。。。。。用户ID(fk)。。。。。。。。。。动作类型


前者的性能很好,但有许多表,后者很紧凑,但在查询(检查操作类型)时速度较慢。哪个解决方案更好?

根据我的意见,第二个方案比第一个方案好得多

1) While querying you will get all data in single query
2) No need to make join different table when getting data from table.
3) Primary key will be in a single column in a table rather than in all tables.
4) Easy to understand and maintain.

在第二种情况下,您可能需要一个表ItemActionTypes来描述每种类型(例如ActionTypeID、ActionTypeDesc)。话虽如此,我可能会选择这个解决方案,但它们似乎都是第三范式,所以这取决于你最需要什么。@ArlaudAgbePierre:我为什么需要那张桌子<
ItemAction
表中的code>ActionType字段(int-type)足以确定动作类型。我误解了吗?这有助于保持正直。没有任何东西禁止我们添加一个ActionType在这里不存在的条目。通过在另一个表中枚举它们,您可以检查此类类型的存在性(在第一个解决方案中这不会是问题,因为每个类型有一个表)。@ArlaudAgbePierre:谢谢!谢谢你的回答。但是如果我需要获得id=1的所有用户
“like”
项,我必须过滤==>比解决方案1慢,不是吗?如果你在ActionType字段上添加索引,这当然会使插入速度慢一点。@JohanGosh:你可以像Arlaud Agbe Pierre所说的那样在特定字段上添加索引。