【问题标题】:Data storing design prob. Should I combine database + XML?数据存储设计问题。我应该结合数据库+ XML吗?
【发布时间】:2016-06-24 08:12:33
【问题描述】:

我遇到了设计问题。抱歉,如果这没有发布在正确的类别中,我真的想知道在哪里提出这个问题:-/

我为一个朋友(从现在起称为“管理员”)做了这个小型 Zumba 课程应用程序。这是一个使用 django 和 sqlite 制作的本地 Web 应用程序来存储数据。起初,只提供 2 类类别:Regular 和 Advanced,因此对这部分进行了硬编码以简化逻辑。

现在,我正在努力使这种动态化,并允许创建任意数量的类类型,而无需每次都修改代码和数据库架构。 例如,可能有: 14 岁及以下的“青少年” “常规的” “高级”

然后管理员可以为这些相应的班级创建“打孔卡”。 例子: 普通 20 :包括 20 次任何普通班级的通行证。 黄金 30:任何黄金级别的 30 通行证。 等等 在应用程序逻辑中,普通通行证持有者无法使用它来访问 Gold 类,因为该类的价格不同。所以他必须通过金卡才能进入这些课程。

现在,这就是我卡住的地方。如何将此信息添加到会员帐户并能够使用它?我的问题是每次使用打孔卡时,留下的通行证数量必须减少一。并且当会员购买新卡时,它必须允许将新通行证添加到剩余金额中。 它看起来很容易,只需在成员模型中添加一个字段,保存每个类类型的剩余通行数。(这就是我以前所做的)但是,因为我现在想让管理员创建新类型的类,我'永远不会知道需要多少这些字段。(因为模型需要每个类类型一个字段)

然后我想使用一个包含 dict 的字段,[classtype_id, #_passes] 类类型 id 会告诉我它是黄金类、普通类还是任何其他类,后面的数字是剩余的通行证。但是我搜索了一下,似乎您无法将字典存储在数据库中(很遗憾)。

我应该将此信息存储到 XML 文件中吗?将数据库查询与文件操作结合起来会大大减慢速度吗?

还有其他需要探索的解决方案吗?

如果有帮助,这里是模型:

class ClassType(models.Model):
name = models.CharField(max_length=64, blank=False, null=False)
default = models.BooleanField(default=False)




class MyUsers(models.Model):
    username = models.CharField(max_length=64, unique=True, db_index=True)
    firstname = models.CharField(max_length=64)
    lastname = models.CharField(max_length=64)
    fullname = models.CharField(max_length=128, db_index=True, editable=False)
    email = models.CharField(max_length=64, db_index=True)
    telephone = models.CharField(max_length=64, null=True, blank=True)
    member_since = models.DateTimeField(editable=False)
    last_seen = models.DateTimeField(editable=False, null=True)
    notes = models.TextField(blank=True, null=True)


def save(self):
    if not self.id:
        self.member_since = datetime.date.today()
    self.fullname = self.firstname + " " + self.lastname
    super(MyUsers, self).save()


class Classes(models.Model):
    name = models.CharField('Class Name', max_length=64, blank=False, null=False)
    date = models.DateTimeField('Start Date & Time', blank=False, null=False)
    classtype = models.ForeignKey(ClassType, blank=False, null=False, default=1)
    status = models.IntegerField('Status', default=1)  # 1 = open, 0 = closed
    myusers = models.ManyToManyField(MyUsers, blank=True)



class Punchcard(models.Model):
    classes = models.IntegerField('Number of classes', blank=False, null=False)
    price = models.DecimalField(decimal_places=2, max_digits=6, blank=False, null=False)
    label = models.CharField('Name of the punchcard', max_length=64, db_index=True, blank=False, null=False)
    classtype = models.ForeignKey(ClassType, blank=False, null=False)
    myusers = models.ManyToManyField(MyUsers, blank=True)

    def __str__(self):
        return self.label

    class Meta:
        verbose_name = 'Punchcard'
        verbose_name_plural = 'Punchcards' 

【问题讨论】:

    标签: django python-3.x database-design django-models


    【解决方案1】:

    您必须将打孔卡类型与打孔卡分开

    PunchcardType连接班级类型,有充值班数、价格等信息

    Punchcard 应该有一个指向用户的 fk 和一个指向 PunchcardType 的 fk。它们应该包含当前可供该类型用户使用的类的数量。用户每次上课时,相应的代币数量都会减少 1,每次用户购买打孔卡时,您都会增加 cardType.classes。

    models.py 应该是这样的:

    class ClassType(models.Model):
    name = models.CharField(max_length=64, blank=False, null=False)
    default = models.BooleanField(default=False)
    
    class MyUsers(models.Model):
        username = models.CharField(max_length=64, unique=True, db_index=True)
        firstname = models.CharField(max_length=64)
        lastname = models.CharField(max_length=64)
        fullname = models.CharField(max_length=128, db_index=True, editable=False)
        email = models.CharField(max_length=64, db_index=True)
        telephone = models.CharField(max_length=64, null=True, blank=True)
        member_since = models.DateTimeField(editable=False)
        last_seen = models.DateTimeField(editable=False, null=True)
        notes = models.TextField(blank=True, null=True)
    
    def save(self):
        if not self.id:
            self.member_since = datetime.date.today()
        self.fullname = self.firstname + " " + self.lastname
        super(MyUsers, self).save()
    
    
    class Classes(models.Model):
        name = models.CharField('Class Name', max_length=64, blank=False, null=False)
        date = models.DateTimeField('Start Date & Time', blank=False, null=False)
        classtype = models.ForeignKey(ClassType, blank=False, null=False, default=1)
        status = models.IntegerField('Status', default=1)  # 1 = open, 0 = closed
        myusers = models.ManyToManyField(MyUsers, blank=True)
    
    
    class PunchcardType(models.Model):
        classes = models.IntegerField('Number of classes', blank=False, null=False)
        price = models.DecimalField(decimal_places=2, max_digits=6, blank=False, null=False)
        label = models.CharField('Name of the punchcard', max_length=64, db_index=True, blank=False, null=False)
        classtype = models.ForeignKey(ClassType, blank=False, null=False)
    
    
    class Punchcard(models.Model):
        classes = models.IntegerField('Number of classes', blank=False, null=False)
        cardtype = models.ForeignKey(PunchcardType, blank=False, null=False)
        myuser = models.ForeignKey(MyUsers, blank=True)
    

    【讨论】:

    • 谢谢,这很有意义。我从来没有想过将它进一步分开。
    猜你喜欢
    • 2011-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    • 1970-01-01
    相关资源
    最近更新 更多