# Schema Design Explanation The database schema is designed to support the application's functionality by efficiently managing user data, chat sessions, messages, and model usage statistics. Each model is structured to ensure data integrity and facilitate quick access to relevant information, enabling seamless interactions within the Auto-Analyst application. ## Database Schema The application uses the following database models: ### User The User table is used to store user information, including their username, email, and creation date. It is defined in the `init_db.py` file at [init_db.py#L17](../src/init_db.py#L17). ```python class User(Base): __tablename__ = 'users' user_id = Column(Integer, primary_key=True, autoincrement=True) username = Column(String, unique=True, nullable=False) email = Column(String, unique=True, nullable=False) created_at = Column(DateTime, default=datetime.utcnow) ``` ### Chat The Chat table is used to store chat sessions, including the chat ID, user ID, title, and creation date. It is defined in the `init_db.py` file at [init_db.py#L25](../src/init_db.py#L25). ```python class Chat(Base): __tablename__ = 'chats' chat_id = Column(Integer, primary_key=True, autoincrement=True) user_id = Column(Integer, ForeignKey('users.user_id'), nullable=True) title = Column(String, default='New Chat') created_at = Column(DateTime, default=datetime.utcnow) ``` ### Message The Message table is used to store messages, including the message ID, chat ID, sender, content, and timestamp. It is defined in the `init_db.py` file at [init_db.py#L30](../src/init_db.py#L30). ```python class Message(Base): __tablename__ = 'messages' message_id = Column(Integer, primary_key=True, autoincrement=True) chat_id = Column(Integer, ForeignKey('chats.chat_id'), nullable=False) sender = Column(String, nullable=False) # 'user' or 'ai' content = Column(Text, nullable=False) timestamp = Column(DateTime, default=datetime.utcnow) ``` ### ModelUsage The ModelUsage table is used to store model usage statistics, including the usage ID, user ID, chat ID, model name, provider, prompt tokens, completion tokens, total tokens, query size, response size, cost, timestamp, and streaming status. It is defined in the `init_db.py` file at [init_db.py#L40](../src/init_db.py#L40). ```python class ModelUsage(Base): __tablename__ = 'model_usage' usage_id = Column(Integer, primary_key=True) user_id = Column(Integer, ForeignKey('users.user_id'), nullable=True) chat_id = Column(Integer, ForeignKey('chats.chat_id'), nullable=True) model_name = Column(String(100), nullable=False) provider = Column(String(50), nullable=False) prompt_tokens = Column(Integer, default=0) completion_tokens = Column(Integer, default=0) total_tokens = Column(Integer, default=0) query_size = Column(Integer, default=0) # Size in characters response_size = Column(Integer, default=0) # Size in characters cost = Column(Float, default=0.0) # Cost in USD timestamp = Column(DateTime, default=datetime.utcnow) is_streaming = Column(Boolean, default=False) request_time_ms = Column(Integer, default=0) # Request processing time in milliseconds ``` The models defined in this file are utilized for storing and retrieving data in the database. The database schema is managed using SQLAlchemy, which facilitates the creation and manipulation of these models. For the initialization of the database, refer to the [init_db.py](/Auto-Analyst-CS/auto-analyst-backend/src/init_db.py) file.