数据库 表关系设计参考

表关系设计

出版社表关系

# 出版社表
class Publisher(models.Model):
    name = models.CharField(max_length=32)
    addr = models.CharField(max_length=128)
    phone = models.IntegerField()

    def __str__(self):
        return self.name

# 作者表
class Author(models.Model):
    name = models.CharField(max_length=16)
    # 作者和详情表示一对一关联的
    detail = models.OneToOneField(to="AuthorDetail")
    # 作者和书的关系是多对多
    books = models.ManyToManyField(to="Book")

    def __str__(self):
        return self.name

# 作者详情表
class AuthorDetail(models.Model):
    city = models.CharField(max_length=32)
    email = models.EmailField()

class Book(models.Model):
    title = models.CharField(max_length=16)
    price = models.DecimalField(max_digits=5, decimal_places=2)  # 5位数字,两位小数 999.99
    # auto_now=True 每一次修改都自动更新时间;auto_now_add=True 第一次创建时自动填写时间
    publish_day = models.DateField(auto_now_add=True)
    # 书和出版社是多对一,通过外键关联
    publisher = models.ForeignKey(to="Publisher")

    memo = models.CharField(max_length=128, null=True)

    def __str__(self):
        return self.title

博客系统表关系

from django.contrib.auth.models import AbstractUser

class UserInfo(AbstractUser):
    """
    用户信息
    """
    nid = models.AutoField(primary_key=True)
    nickname = models.CharField(verbose_name='昵称', max_length=32)
    telephone = models.CharField(max_length=11, null=True, unique=True)
    avatar = models.FileField(upload_to = 'avatars/',default="/avatars/default.png")
    create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)
    blog = models.OneToOneField(to='Blog', to_field='nid',null=True)

    def __str__(self):
        return self.username

class Blog(models.Model):

    """
    博客信息
    """
    nid = models.AutoField(primary_key=True)
    title = models.CharField(verbose_name='个人博客标题', max_length=64)
    site = models.CharField(verbose_name='个人博客后缀', max_length=32, unique=True)
    theme = models.CharField(verbose_name='博客主题', max_length=32)

    def __str__(self):
        return self.title

class Category(models.Model):
    """
    博主个人文章分类表
    """
    nid = models.AutoField(primary_key=True)
    title = models.CharField(verbose_name='分类标题', max_length=32)
    blog = models.ForeignKey(verbose_name='所属博客', to='Blog', to_field='nid')

    def __str__(self):
        return self.title
class Tag(models.Model):

    nid = models.AutoField(primary_key=True)
    title = models.CharField(verbose_name='标签名称', max_length=32)
    blog = models.ForeignKey(verbose_name='所属博客', to='Blog', to_field='nid')
    def __str__(self):
        return self.title

class Article(models.Model):

    nid = models.AutoField(primary_key=True)
    title = models.CharField(max_length=50, verbose_name='文章标题')
    desc = models.CharField(max_length=255, verbose_name='文章描述')

    comment_count= models.IntegerField(default=0)
    up_count = models.IntegerField(default=0)
    down_count = models.IntegerField(default=0)

    create_time = models.DateTimeField(verbose_name='创建时间')

    homeCategory = models.ForeignKey(to='Category', to_field='nid', null=True)
    #siteDetaiCategory = models.ForeignKey(to='SiteCategory', to_field='nid', null=True)

    user = models.ForeignKey(verbose_name='作者', to='UserInfo', to_field='nid')
    tags = models.ManyToManyField(
        to="Tag",
        through='Article2Tag',
        through_fields=('article', 'tag'),
    )

    def __str__(self):
        return self.title

class ArticleDetail(models.Model):
    """
    文章详细表
    """
    nid = models.AutoField(primary_key=True)
    content = models.TextField()
    article = models.OneToOneField(to='Article', to_field='nid')

class Comment(models.Model):
    """
    评论表
    """
    nid = models.AutoField(primary_key=True)
    article = models.ForeignKey(verbose_name='评论文章', to='Article', to_field='nid')
    user = models.ForeignKey(verbose_name='评论者', to='UserInfo', to_field='nid')
    content = models.CharField(verbose_name='评论内容', max_length=255)
    create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)

    parent_comment = models.ForeignKey('self', null=True)

    def __str__(self):
        return self.content

class ArticleUpDown(models.Model):
    """
    点赞表
    """
    nid = models.AutoField(primary_key=True)
    user = models.ForeignKey('UserInfo', null=True)
    article = models.ForeignKey("Article", null=True)
    is_up=models.BooleanField(default=True)

    class Meta:
        unique_together = [
            ('article', 'user'),
        ]

class Article2Tag(models.Model):
    nid = models.AutoField(primary_key=True)
    article = models.ForeignKey(verbose_name='文章', to="Article", to_field='nid')
    tag = models.ForeignKey(verbose_name='标签', to="Tag", to_field='nid')

    class Meta:
        unique_together = [
            ('article', 'tag'),
        ]

    def __str__(self):
        v=self.article.title+"----"+self.tag.title
        return v

权限系统表关系

class Menu(models.Model):
    caption=models.CharField(max_length=32)

    def __str__(self):
        return self.caption

class UserInfo(models.Model):
    name=models.CharField(max_length=32)
    pwd=models.CharField(max_length=32,default=123)
    email=models.EmailField()
    roles=models.ManyToManyField(to="Role")

    def __str__(self):
        return self.name

class Role(models.Model):
    title=models.CharField(max_length=32)
    permissions=models.ManyToManyField(to="Permission")
    def __str__(self):
        return self.title

class Permission(models.Model):
    url=models.CharField(max_length=32)
    title=models.CharField(max_length=32)
    permission_group=models.ForeignKey("PermissionGroup",default=1)
    code=models.CharField(max_length=32,default="")
    parent=models.ForeignKey("self",default=1,null=True,blank=True)
    def __str__(self):
        return self.title

class PermissionGroup(models.Model):
    caption=models.CharField(max_length=32)
    menu=models.ForeignKey("Menu",default=1)
    def __str__(self):
        return self.caption

原文地址:https://www.cnblogs.com/iyouyue/p/9021820.html

时间: 2024-08-27 18:17:02

数据库 表关系设计参考的相关文章

树形结构的数据库表Schema设计-基于左右值编码

树形结构的数据库表Schema设计 程序设计过程中,我们常常用树形结构来表征某些数据的关联关系,如企业上下级部门.栏目结构.商品分类等等,通常而言,这些树状结构需要借助于数据库完 成持久化.然而目前的各种基于关系的数据库,都是以二维表的形式记录存储数据信息,因此是不能直接将Tree存入DBMS,设计合适的Schema及其对 应的CRUD算法是实现关系型数据库中存储树形结构的关键. 理想中树形结构应该具备如下特征:数据存储冗余度小.直观性强:检索遍历过程简单高效:节点增删改查CRUD操作高效.无意

Django博客项目之表关系设计

一.需要创建的表以及表之间的关系 1.User(用户信息表) User表和Blog表是一对一关系,即一个用户对应一个个人站点 2.Blog(个人站点表) 3.Category(文章分类表) Blog和Category表是一对多关系,即一个站点可以有多个分类,但是一个分类只属于一个站点 4.Tag(文章标签表) Blog和Tag表是一对多关系,即一个站点可以有多个标签,但是一个标签只属于一个站点 5.Article(文章表) User和Article表是一对多关系,即一个用户可以有多篇文章,但是一

数据库表关系(一堆垛,多对多)

1.记住,永远记住:表与表之间关联的唯一手段就是外键 表与表之间相关联只能通过外键. 2.所以数据库表与表之间的,一对多,多对多关系.说白了就是怎样建立外键的关系,在哪个表建立外键. 通过外键维持各种表之间的关系. 3. 6 表与表之间的关系 l 一对一:例如t_person表和t_card表,即人和身份证.这种情况需要找出主从关系,即谁是主表,谁是从表.人可以没有身份证,但身份证必须要有人才行,所以人是主表,而身份证是从表.设计从表可以有两种方案: 在t_card表中添加外键列(相对t_use

数据库表关系及配置

1.数据库表中的关系 一对一 一对多(多对一) 多对多 2.如何确立和实现数据库中的表关系 一对多的表关系实现: 使用外键约束 我们习惯把一的方称为主表,把多的方称为从表 外键:从表中有一列,除了null之外,只能来源于主表的主键 默认情况下,外键的字段是可以重复的 多对多的表关系在数据库中实现: 使用中间表 中间表有两个外键,引用两个多对多表的主键 不能有其它字段信息,至于中间表的主键,应该采用联合主键 任何一个多方表和中间表去比较都是一对多的关系 一对一的表关系再数据库中实现: 有两种: 1

树形结构的数据库表Schema设计

今天又有幸遇到一个不知道的东西,那就是树型结构在数据库表中设计的问题.由于只是阅读了人家的东西,就直接给连接吧. 第一个:http://blog.csdn.net/monkey_d_meng/article/details/6647488 第二个:http://my.oschina.net/XYleung/blog/99604 两个讲的都是一个道理,不同的人合适不同的版本吧.都给大家吧.

数据库表关系:多对多的三中方式

1.第一种django orm在创建表的时候自动帮我们创建表关系 from django.db import models # Create your models here. #创建book表 class Book(models.Model): name=models.CharField(max_length=32) # 第一种方式,系统帮我们自动创建了表book与表author关系 authors=models.ManyToManyField(to='Author') #创建作者表 clas

MySQL数据库优化技术之数据库表的设计

三范式介绍表的范式:只有符合的第一范式,才能满足第二范式,进一步才能满足第三范式. 1. 第一范式:表的列具有原子性,不可再分解.只要是关系型数据库都自动满足第一范式.数据库的分类:关系型数据库:MySQL/ORACLE/Sql Server/DB2等非关系型数据库:特点是面向对象或者集合nosql数据库:MongoDB(特点是面向文档) 2. 第二范式:表中的记录是唯一的,就满足第二范式.通常我们设计一个主键来实现.主键一般不含业务逻辑,一般是自增的: 3. 第三范式:表中不要有冗余数据,即如

支付业务的数据库表的设计

一.数据表 数据库中的数据表是整个核心逻辑的载体说在,所有的记账逻辑.以及与支付前台交互的数据都是在这里 进行记录.现就主要的表进行简要说明.不同的第三方支付其数据表名称肯定也不同,这里的表名称仅作参考 gTransLog表: 支付网关交易流水表,所有通过网关的交易全部都会在此表中写入数据. tAccounts表: 用户的账户数据记录表,在第三方系统中其记录着用户的账上资金. tAccountLog表: 用于记录账户的自己流水情况,所有对tAccounts表的资金变动都会在流水表中进行记录 tB

数据库表的设计 注意点

注意点: 如果是代码表基本不会变化的我们可以只设计  dm字段而不加pkid字段  代码表还会不断变化的话我们再加一个pkid自增长,如果涉及到外键我们要引用的是dm而不是pkid,因为这样我在导入数据的时候可以避免数据对不上.  业务表的话我们还是也加一个dm(可以guid)字段好了,Pkid自增长或者我们只要一个Id(guid)这样都是防止自增长的特性导致导入数据混乱,那么我们guid还是在前台生成好再插进去,不然同样会导致和自增长一样的导入数据混乱.