Django数据库设计:多对多,外键,还是两者都没有?

n.e*_*ind 2 database django postgresql django-models

一个菜鸟问题.我正在整理我的第一个数据库并遇到以下设计问题:我有一个定义书籍的类(例如它的标题)和一个定义页面的类(例如它的设计).

课本表看起来如此:

Title        | PAGE1        | PAGE2        | PAGE3
Book-One     | SAMPLE1-UUID | SAMPLE2-UUID | SAMPLE3-UUID
Book-Two     | SAMPLE4-UUID | SAMPLE5-UUID | SAMPLE6-UUID
Run Code Online (Sandbox Code Playgroud)

类页面的表格:

UUID         | FONT         | CONTENTS etc.
SAMPLE1-UUID | Times        | Example
SAMPLE2-UUID | Arial        | Example Two
SAMPLE3-UUID | Verdena      | Example Three
Run Code Online (Sandbox Code Playgroud)

现在,由于每个页面都是唯一的,并且无法在另一本书中重复使用,因此我不能对Pages使用多对多关系.我可以使用Foreign-Key链接两个表,即将Books表的SAMPLE1-UUID与Pages表的SAMPLE1-UUID链接.这样做的好处是不会两次创建相同的条目.

但是,我不喜欢为我的页面设置固定数量的行.在上面的Book类示例中,我必须定义一组特定的页面,如PAGE1,PAGE2,PAGE3,PAGE4,... PAGE99.理想情况下,我需要的只是我的书类的灵活页面列表,如下所示:

Name         | Pages
Book-One     | "SAMPLE1-UUID, SAMPLE2-UUID"
Book-Two     | "SAMPLE4-UUID, SAMPLE5-UUID, SAMPLE6-UUID"
Run Code Online (Sandbox Code Playgroud)

Pages将是一个简单的CharField,其内容将是一个列表.但后来我遇到了这两个表不再链接的问题,我必须创建两次每个条目(即我必须在页面和书籍表中输入SAMPLE1-UUID).

有没有其他方法来设计这个数据库?谢谢你的任何建议!

ken*_*eni 5

我建议你不要把这些页面作为列:

课本表格看起来只有书本信息:

Title        | ISBN         
Book-One     | XXXXXXXXXXXX 
Book-Two     | YYYYYYYYYYYY 
Run Code Online (Sandbox Code Playgroud)

类页面的表格:

BOOKID       |PAGE_NUM | FONT         | CONTENTS
1            |1        | Times        | Example
1            |2        | Arial        | Example Two
2            |1        | Verdena      | Example Three
Run Code Online (Sandbox Code Playgroud)

你的课堂设计看起来像:

class Book(models.Model):
    title = models.CharField(max_length=100)
    isbn = models.CharField(max_length=100)

class Page(models.Model):
    book = models.ForeignKey(Book)
    page_num = models.IntegerField()
    font = models.charField(max_length=100)
    content = models.TextField()
Run Code Online (Sandbox Code Playgroud)

您可以继续使用约束,以便书籍和page_num不会重复,但这可能是一个好的开始.