小白请教,业务中需要一个“作品”的 model ,存放类型为纯文本文章、音频、视频三种类型的作品。以下两种设计:
通用的一个“作品” model ,包含了 content 字段(存放文章内容), attachment 字段(存放视频、音频)。当类型为文章时, attachment 字段为空,当作品类型为视频、音频时, content 字段为空。
一个抽象的“作品” model ,包含了所有类型作品的通用字段。同时再分别有“文本作品”和“多媒体作品”的 model ,继承于抽象的“作品” model ,分别比“作品”多了 content 字段 和 attachment 字段。
请教一下,上面两种设计,那种更灵活?
个人感觉第一种比较灵活,只是字段校验是稍微麻烦点。
还请各位指点。
1
WildCat 2017-01-05 16:45:17 +08:00
第一种吧, WordPress 貌似就是这么干的
|
2
konakona 2017-01-05 16:48:39 +08:00
两种方法都有其各自可取之处,取决于实际业务中,是否有变动来抉择。
第一种是建立在你肯定这个东西不再多变的基础上。它的好处是节省了查询效率、表空间等。 第二种适合多变的需求。它的好处是改来改去对其依赖的功能没有影响。 如果你的老板经常发春,改来改去的,今天附件是 1 个,明天附近是 2 个,后天附件多了个 ext 、 fakename 、 outside_link 之类一堆扩展字段——这种可能性及高,那肯定是用第二种。 |
3
hoythan 2017-01-05 16:48:41 +08:00
ID 自增
post_author 作者 post_date 上传时间 post_date_gmt 上传时间(出现多国家情况下适用) post_content 内容 post_title 标题 post_status 文章状态 comment_status 评论状态 post_password 文章加密 post_name 文章 url 名称(urlcode 编码) post_modified 文章修改时间 post_modified_gmt post_parent 文章上级 guid 文章 url 地址 post_type 文章类型 post_mime_type 文章类型 comment_count 评论数量 其中, post_type 包括 post\attachment\page 等 post_mime_type 包括 image/jpeg 等附件格式或空 例子: 当文章 post_type 为 post 或 page 时, post_title 为文章标题, post_comtent 为文章内容,post_mime_type 留空 当文章 post_type 为 attachment 时, post_title 为文件名称, post_content 为 图片描述, post_mime_type 为附件格式 格式出自 wordpress |
4
hoythan 2017-01-05 16:52:34 +08:00
另附一张表, postmeta 用于存放字段相关内容.
post_meta 包括 meta_id \ post_id \ meta_key \ meta_value 当 post_type 为 attachment 时, meta_key => _wp_attached_file \ meta_value => 服务器绝对路径 meta_key =>_wp_attachment_metadata \ meta_value => 包括,图片尺寸,大小,版权等信息 |
5
banks0913 OP @konakona 有个问题。假设采用第二种方案,如果我需要得到所有作品的点击量排行、热度排行等,不管类型是什么,就需要手动地去取两个 model 的所有内容,合并到一起,并且根据相关排序字段排序后返回 top N 。无法简单地使用 model.objects().order_by()这种操作了,对吧?
|
7
cheetah 2017-01-05 17:49:30 +08:00
2
|
8
xxdd 2017-01-05 18:00:32 +08:00
今天 boss 手写代码教会我第二种
所以我选第二个 |
9
glasslion 2017-01-05 18:24:36 +08:00
@banks0913 第二种; 点击量那些公共信息提取出来放到一个公共的 Model, 各种作品 再外键到那个公共 Model 上; 不要使用 Django 的 Model 继承
|
10
banks0913 OP @glasslion 那如果我要对所有类型的作品一起进行查询,或者排序,比如热门作品(不分类别),就需要依次获取几种作品 model 的 objects(),然后合并到一个大的集合里,再对集合进行排序或者之类的操作?
|
12
konakona 2017-01-05 23:44:11 +08:00
@banks0913 你可以用 ViewModel ( MYSQL 的 View 视图)弄串表。也可以用 ORM 的特性,实现 hasmany 或者 belongs 这种。我推荐 ORM 。
|