我被假期包裹清单项目的数据库设计所困扰,该数据库包含一个用于存储包裹信息的主表packages
。
这是田野
身份PK
package_name varchar
景点json eg-field:['super','funny'],
includes json eg-field:['hello','cool']
一个包可能有很多吸引力和内含物,所以这就是我选择json
字段的原因。
那么这是一种land毁的方式还是将吸引力和内含物保留在另一个具有外键关系的表中?
如果我选择第二种方法(即,针对吸引人和包含对象的不同表),那么搜索具有特定吸引人的包会认为搜索需要联接查询(使用联接搜索是一种不好的做法?。)。
但是在第一种方法中,我们可以应用json搜索(MySQL版本> 5.7支持json搜索)。
最佳答案
这取决于您预见该项目将变得多么复杂。您可以使用现有的表配置并利用JSON搜索功能,但是随着表的增大,这将成为性能上越来越大的问题。
最好创建4个表,包,内含物,景点和关系。
配套
ID(整数)PK
名称(varchar)
旅游景点
ID(整数)PK
名称(varchar)
内含物
ID(整数)PK
名称(varchar)
关系
ID(整数)PK
PID(int)FK-软件包
RID(int)包含或吸引的ID
类型(varchar)表示包含或吸引
然后,您可以进行联接以选择类型的任意组合,并将任意数量的类型相互关联。
SELECT * FROM Packages p join Relation r ON p.ID = r.PID AND r.type = "Attraction" Left Join Attractions a ON a.ID = r.RID WHERE p.id = 1 /*specific package id*/