关于如何建模这个数据库的一些建议

时间:2012-01-13 17:46:32

标签: mongodb database-design relational-database database-schema nosql

我正在建立一个拥有用户的网站。用户可以搜索歌曲并(如果已登录)将其保存到播放列表或其歌曲库中。

我希望它像iTunes一样,播放列表中的所有歌曲都是图书馆的一部分,所以当用户选择查看他们的歌曲库时,会显示播放列表中的歌曲以及刚刚添加的歌曲去图书馆。我想要一首能够存储在多个播放列表中的歌曲。

现在我正在使用Mongodb,做类似的事情:

var UserSchema = new Schema();

var Library = new Schema({
    songs: [SongsSchema],
    user: Schema.ObjectId
});

var Playlist = new Schema({
title: String,
description: String,
user: Schema.ObjectId   
});

var SongsSchema = new Schema({
position: Number,
name: String,
artist: String,
    artistGid: String,
album: String,
    albumGid: String
time: Number,
url: String,
    gid: String,
    location: String (either youtube, vimeo, soundcloud for now),
    playlist: [Schema.ObjectId] (array of object ids that point to playlists?)
});

这看起来最好吗?我习惯于关系,所以看起来有很多重复,但我很难以一种可行的方式对其进行规范化。

2 个答案:

答案 0 :(得分:2)

对我来说很合理。虽然在此设计中您无法支持订购的播放列表。如果你想支持该功能,我会同时包含播放列表的ObjectId和播放列表数组中播放列表中的位置。

答案 1 :(得分:1)

欢迎来到Mongo!

这听起来不错,只要确保你有一个关于songs.playlist的索引

db.collection.ensureIndex({"songs.playlist": 1})

有可能使库/播放列表成为同一个东西,只需将库对象的标题设为“库”