---
title: "Python SQLAlchemy database model for Version Control system"
description: "This is my first time creating a non-trivial database and I was wondering what I could do better. As the title says this will be used a in toy version control system. Most of my choices feel..."
url: https://extraproxies.com/python-sqlalchemy-database-model-for-version-control-system
date: 2024-02-13
modified: 2024-02-13
author: "ExtraProxies"
tags: ["Control", "database", "model", "Python", "SQLAlchemy", "system", "Version"]
type: post
lang: en
---

# Python SQLAlchemy database model for Version Control system

This is my first time creating a non-trivial database and I was wondering what I could do better. As the title says this will be used a in toy version control system. Most of my choices feel "random" because I do not know what is and is not important. I also can not decide on what the tables should know about themselves. For example: *Should objects belong to a commit? Is it ok to keep every object unlabeled and only have commits refer to them. And things like that.* Any review would be welcome.

```
class Object(Base):    __tablename__ = "objects"    oid = Column(String, primary_key= True)    name = Column(String)    blob = Column(BLOB)  class Commit(Base):    __tablename__ = "commits"    oid = Column(String, primary_key= True)    commit_message = Column(String)    parent_oid = Column(String, nullable= True)     objects = relationship("Object", secondary="commit_object_association")     repository_id = Column(Integer, ForeignKey("repositories.id"))    repository = relationship("Repository", back_populates="commits")  # Many to Many  class CommitObjectAssociation(Base):    __tablename__ = 'commit_object_association'    commit_oid = Column(String, ForeignKey('commits.oid'), primary_key=True)    object_oid = Column(String, ForeignKey('objects.oid'), primary_key=True)  class Branch(Base):    __tablename__ = "branches"    id = Column(Integer, primary_key=True, autoincrement=True)    name = Column(String)        head_commit_oid = Column(String, ForeignKey("commits.oid"))        repository_id = Column(Integer, ForeignKey("repositories.id"))    repository = relationship("Repository", back_populates="branches", foreign_keys=)     __table_args__ = (       UniqueConstraint('name', 'repository_id', name='unique_branch_per_repo'),    )   class Repository(Base):    __tablename__ = "repositories"    id = Column(Integer, primary_key=True, autoincrement= True)    name = Column(String)    head_oid = Column(String, nullable= True, default= None)        current_branch_id = Column(Integer, ForeignKey("branches.id"), nullable=True)    current_branch = relationship("Branch", uselist=False, foreign_keys=)     creator_id = Column(Integer, ForeignKey('users.id'), nullable= False)    creator = relationship("User", back_populates="repositories")     commits = relationship("Commit", back_populates="repository")    branches = relationship("Branch", back_populates="repository", foreign_keys="Branch.repository_id")     __table_args__ = (       UniqueConstraint('name', 'creator_id', name='unique_repo_per_user'),    )  class User(Base):    __tablename__ = "users"     id = Column(Integer, primary_key=True, index=True)    name = Column(String, unique= True)    password = Column(String)     repositories = relationship("Repository", back_populates="creator") ```
```
