sharataka
sharataka

Reputation: 5132

What is the most efficient structure to save data in my database?

I am trying to create functionality that allows a user to save items to a playlist and the user can have multiple playlists. Each item can be saved to multiple playlists as well. What is the best way to represent this data? Multiple tables with foreignkeys linking them or just 1 flat table?

multiple tables

class Playlist(models.Model):
    playlist = models.CharField('Playlist', max_length = 2000, null=True, blank=True)
    def __unicode__(self):
        return self.playlist
    
class Video(models.Model):
    video_url = models.URLField('Link to video', max_length = 200, null=True, blank=True)
    video_tag = models.CharField('Video ID', max_length = 2000, null=True, blank=True)
    def __unicode__(self):
        return self.video_url

class UserPlaylist(models.Model):
    profile = models.ForeignKey(User)
    playlist = models.ForeignKey(Playlist)
    def __unicode__(self):
        return unicode(self.playlist)

class Videoplaylist(models.Model):
    video = models.ForeignKey(Video)
    playlist = models.ForeignKey(UserPlaylist)
    def __unicode__(self):
        return unicode(self.playlist)

1 table

class Everything(models.Model):
    profile = models.ForeignKey(User)
    playlist = models.CharField('Playlist', max_length = 2000, null=True, blank=True)
    platform = models.CharField('Platform', max_length = 2000, null=True, blank=True)
    video = models.CharField('VideoID', max_length = 2000, null=True, blank=True)
    def __unicode__(self):
        return u'%s %s %s %s' % (self.profile, self.playlist, self.platform, self.video)

Upvotes: 0

Views: 73

Answers (1)

lins05
lins05

Reputation: 418

There are two main relationships between the entities:

  • Playlist --> User, many to one
  • Video --> PlayList, many to many

Based on the above, you should arrange your data in a way like this:

class User():
    name = CharField()
    # other user info

class Video():
    name = CharField()
    # othter video info

class Playlist():
    user = ForeigenKey(User)
    name = CharField()

class PlaylistVideo():
    plist = ForeigenKey(Playlist)
    video = ForeigenKey(Video)

# When a user adds a video to one of his playlist
def add_video_to_playlist(user_name, playlist_name, video_name)
    user = User.objects.get(name=user_name)
    plist = Playlist.objects.get(user=user, name=playlist_name)

    video = Video.objects.get(name=video_name)
    plv = PlaylistVideo(plist=plist,video=video)
    plv.save()

# To get the content of a user's some playlist:
def get_playlist_content(user_name, playlist_names):
    user = User.objects.get(name=user_name)
    plist = Playlist.objects.get(user=user, name=playlist_name)

    return [plv.video for plv in PlaylistVideo.objects.filter(plist=plist)]

Upvotes: 1

Related Questions