Diseño de base de datos|Base de datos de actividades del jugador del juego|Diseño del curso final

prefacio

那么这里博主先安利一些干货满满的专栏了!

首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助。

高质量博客汇总https://blog.csdn.net/yu_cblog/category_12379430.html?spm=1001.2014.3001.5482


contenido de diseño 

Diseñe una base de datos simple para una empresa de juegos. Los requisitos son los siguientes: los jugadores pueden iniciar sesión en una variedad de juegos operados por la empresa, iniciar sesión en el juego para jugar o recargar el juego. El juego a menudo lanzará algunas actividades y los jugadores pueden participar en ciertas actividades.

ilustrar:

  1. Los tipos de juegos incluyen: gratuitos y no gratuitos. Pagar para jugar juegos no gratuitos
  2. Un jugador no puede participar, o participar en hasta 10 actividades
  3. Un evento puede tener cualquier número de jugadores participando

Diseño Conceptual (Diagrama ER)

Requisitos del tema:

Dibuje un diagrama de modelo ER completo.

Indicar la base de mapeo (One to one, One to many, Many to many), el tipo de participación (parcial y total), y la clave primaria. El resultado se muestra en la figura 1. Donde el guión bajo representa la clave principal de la tabla.

Figura 1
Fig.1 Diagrama ER de la base de datos y anotaciones de cardinalidades de mapeo y tipos de participación

esquema relacional

Requisitos del tema: convertir el diagrama ER en un esquema relacional y marcar la clave principal.

Como se muestra, el esquema de relación se muestra en la Fig.2.

Fig.2 Esquema relacional de la base de datos

 La clave principal de todas las tablas está subrayada.

codigo SQL

Restricciones relacionadas con la creación de tablas Sentencias SQL y esquemas relacionales

Crear una tabla de entidades de juego

CREATE TABLE Games ( 
  GameID Counter PRIMARY KEY, 
  GameName varchar(255) NOT NULL, 
  Cost money default 0, 
  GameType varchar(10) default 免费 NOT NULL 
);

restricciones relacionadas

GameID: ID del juego (contador)

GameName: nombre del juego (una cadena con una longitud máxima de 255)

Costo: costo del juego (el valor predeterminado es 0 tipo de moneda)

GameType: tipo de juego (el valor predeterminado es "gratis", una cadena de longitud 10, bajo la restricción no nula, y la restricción es que el valor solo puede ser uno de "pagado" o "gratis")

Establezca la GamesRulerestricción con nombre de la mesa de juego, el tipo de juego de restricción solo puede ser 'gratis' o 'pagado'

ALTER TABLE Games ADD CONSTRAINT GamesRule CHECK (GameType IN ('Gratis', 'Pagado'));

Crear tabla de actividades

CREAR TABLA Actividades ( 
  Contador de ID de actividad CLAVE PRINCIPAL, Nombre 
  de actividad varchar (255) NO NULL 
);

restricciones relacionadas

ActivityID: ID de actividad (contador)

ActivityName: nombre de la actividad (una cadena con una longitud máxima de 255, sujeta a una restricción no nula)

Crear tabla de entidad de jugador

CREATE TABLE Players ( 
  PlayerID Counter PRIMARY KEY, 
  PlayerName varchar(255) NOT NULL, 
  PlayerPass varchar(255) NOT NULL 
);

restricciones relacionadas

PlayerID: ID del jugador (contador)

PlayerName: nombre del jugador (una cadena con una longitud máxima de 255, sujeta a la restricción no nula)

PlayerPass: contraseña del jugador (una cadena con una longitud máxima de 255, sujeta a la restricción no nula)

Crear una tabla de relaciones de juego de jugadores (tabla de inicio de sesión)

CREAR TABLA Iniciar sesión ( 
  PlayerID INT, 
  GameID INT, 
  ParticipateActivity BIT DEFAULT 0, 
  Balance MONEY NOT NULL DEFAULT 0, 
  LoginTime DATETIME DEFAULT GETDATE(), 
  FOREIGN KEY (PlayerID) REFERENCES Players(PlayerID), 
  FOREIGN KEY (GameID) REFERENCES Games(GameID) 
);

restricciones relacionadas

PlayerID: ID del jugador (entero)

GameID: ID del juego (entero)

ParticipateActivity: si participar en la actividad (el valor predeterminado es el tipo de datos de 0 bits)

Saldo de dinero: saldo (bajo la restricción no vacía, el valor predeterminado es 0 tipo de moneda)

LoginTime: última hora de inicio de sesión (tipo DATETIME)

Restricciones de clave externa: la clave externa de PlayerID se refiere a Players (PlayerID), la clave externa de GameID se refiere a Games (GameID)

Crear una tabla de relación de actividad de juego

CREATE TABLE GameActivities ( 
  GameID int, 
  ActivityID int, 
  FOREIGN KEY (GameID) REFERENCES Games(GameID), 
  FOREIGN KEY (ActivityID) REFERENCES Activities(ActivityID) 
);

restricciones relacionadas

GameID: ID del juego (entero)

ActivityID: ID de actividad (entero)

Restricción de clave externa: la clave externa GameID se refiere a Juegos (GameID), la clave externa de ActivityID se refiere a Actividades (ActivityID)

Crear una tabla de relación de actividad de jugador

CREATE TABLE PlayerActivities ( 
  PlayerID int, 
  ActivityID int, 
  FOREIGN KEY (PlayerID) REFERENCES Players(PlayerID), 
  FOREIGN KEY (ActivityID) REFERENCES Activities(ActivityID) 
);

restricciones relacionadas

PlayerID: ID del jugador (entero)

ActivityID: ID de actividad (entero)

Restricción de clave externa: la clave externa PlayerID se refiere a los jugadores (PlayerID), la clave externa de ActivityID se refiere a las actividades (ActivityID)

crear disparador

Cree un activador para verificar si la cantidad de eventos en los que ha participado el jugador ha alcanzado el límite de 10

CREAR DISPARADOR LimitPlayerActivities 
ANTES DE INSERTAR EN Iniciar sesión 
PARA CADA FILA 
COMENZAR 
    DECLARAR total_activities INT; 
    -- 计算
    SELECCIONE COUNT(*) INTO total_activities 
    FROM Iniciar sesión 
    WHERE PlayerID = NEW.PlayerID; 
    
    IF total_activities >= 10 THEN 
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Un jugador puede participar en un máximo de 10 actividades.'; 
    TERMINARA SI; 
FIN;

Preguntar

Encuentre la declaración sql de todos los jugadores que participaron en todas las actividades lanzadas por el juego A

SELECCIONE DISTINTOS Players.PlayerID, Players.PlayerName 
FROM Players 
INNER JOIN Iniciar sesión ON Players.PlayerID = Login.PlayerID 
INNER JOIN GameActivities ON Login.GameID = GameActivities.GameID 
INNER JOIN Actividades ON GameActivities.ActivityID = Activities.ActivityID 
INNER JOIN Juegos ON GameActivities. GameID = Juegos.GameID 
WHERE Juegos.GameName = 'A';

Descubra la declaración sql del juego que lanzó más de 3 veces de actividades

SELECCIONE G.GameID, G.GameName, COUNT(GA.ActivityID) COMO ActivityCount 
DESDE Juegos G 
ÚNASE GameActivities GA EN G.GameID = GA.GameID 
GRUPO POR G.GameID, G.GameName 
CON COUNT(GA.ActivityID) > 3;

Álgebra relacional para encontrar todas las identificaciones de jugadores que recargan el juego A más alto que cierto jugador

 La fórmula de este álgebra relacional describe una serie de operaciones, y el significado y propósito de cada paso es el siguiente:

  1. Login ⨝ PlayersEste paso utiliza el operador ⨝, que representa una operación de conexión, conectando las relaciones "Iniciar sesión" y "Jugadores". Una operación de combinación combina tuplas que satisfacen la condición de combinación en función de las propiedades comunes entre dos relaciones. El propósito de este paso es conectar los datos en la relación entre "Iniciar sesión" y "Jugadores" para operaciones posteriores.

  2. ρ PlayerID/PlayerID (Login ⨝ Players)Este paso utiliza el operador ρ, que cambia el nombre de la relación. En esta fórmula, cambiamos el nombre del resultado de "Iniciar sesión ⨝ Jugadores" a "PlayerID", es decir, cambiamos el nombre del campo PlayerID en el resultado a PlayerID. El propósito de este paso es expresar mejor el siguiente paso.

  3. σ GameName='A' ⨝ Balance > AmountEste paso utiliza el operador σ, y su función es realizar una operación de selección sobre la relación, es decir, filtrar tuplas calificadas según las condiciones dadas. En esta fórmula, seleccionamos la tupla con GameName 'A' y Balance mayor que Amount. El propósito de este paso es filtrar los datos que cumplen los requisitos según condiciones específicas.

  4. π PlayerIDEste paso utiliza el operador π y su función es realizar una operación de proyección sobre la relación, es decir, solo se conserva la columna de atributo especificada. En esta fórmula, solo mantenemos la columna de atributos PlayerID, mientras que otras columnas de atributos están excluidas. El propósito de este paso es mantener solo el atributo PlayerID de los resultados filtrados en el paso anterior, para obtener el resultado final.

En resumen, el significado de la fórmula del álgebra relacional es: conecte (⨝) todas las tuplas coincidentes de las relaciones "Iniciar sesión" y "Jugadores", y luego seleccione (σ) GameName es 'A' y Balance es mayor que Amount según la condición, y finalmente mantener solo la columna de atributo (π) PlayerID. El objetivo de esta operación es encontrar todos los ID de jugadores cuya recarga sea superior a la de un determinado jugador.

Diseñe varios procedimientos y funciones prácticos de SQL

Cuente la cantidad de personas que inician sesión (juegan juegos pagos) para un juego determinado (función)

CREAR PROCEDIMIENTO GetLoginCountByGameName(IN gameName VARCHAR(255), OUT loginCount INT) 
COMENZAR 
    SELECCIONAR COUNT(DISTINCT PlayerID) INTO loginCount 
    DESDE Iniciar sesión 
    INNER JOIN Juegos ON Login.GameID = Games.GameID 
    WHERE Games.GameName = gameName; 
FIN; 
-- 调用
CALL GetLoginCountByGameName('A', @loginCount); 
SELECCIONE @loginCount;

Cuente la cantidad total pagada por todos los jugadores en el día para un juego determinado (proceso)

En primer lugar, necesitamos crear un procedimiento almacenado. El parámetro de entrada del procedimiento almacenado es 1 que representa el nombre del juego, y el resultado de salida es 1 que representa la cantidad total, y la función de agregación SUM se usará para calcular la cantidad total. Necesitamos combinar la tabla de juego del jugador y la tabla de juego Hacer una conexión interna, la condición de conexión interna es que las ID del juego sean iguales y agregar una wherecláusula, para que podamos obtener todos los registros de los jugadores y sus costos de juego correspondientes que han jugado el juego especificado por los parámetros de entrada.En este momento, la suma de los costos es el final.Se obtiene el resultado total, podemos seleccionar para generar el resultado total. Finalmente, probamos llamando al procedimiento almacenado CalculateTotalPaymentsByGameNamey encontramos que se obtuvo el valor correcto. El código SQL es el siguiente.

CREAR PROCEDIMIENTO CalculateTotalPaymentsByGameName(IN gameName VARCHAR(255), OUT totalPayments DECIMAL(10, 2)) 
BEGIN 
    SELECT SUM(Games.Cost) INTO totalPayments 
    FROM Games 
    INNER JOIN Iniciar sesión ON Login.GameID = Games.GameID 
    WHERE Games.GameName = gameName; 
FIN; 
CALL CalculateTotalPaymentsByGameName('A', @totalPayments); 
SELECCIONE @pagostotales;

Diseñe un activador SQL práctico

Al eliminar un jugador, se eliminará junto con la información relacionada con el jugador (todos los juegos y actividades)

DELIMITADOR // 
CREAR DISPARADOR trg_DeletePlayer 
ANTES DE ELIMINAR EN Jugadores 
PARA CADA FILA 
COMENZAR 
  -- eliminar el registro de inicio de sesión relacionado con el jugador 
  ELIMINAR DESDE Iniciar sesión WHERE PlayerID = OLD.PlayerID; 
  -- eliminar el registro de PlayerActivities relacionado con el jugador 
  ELIMINAR DE PlayerActivities WHERE PlayerID = OLD.IDJugador; 
FIN // 
DELIMITADOR;

Supongo que te gusta

Origin blog.csdn.net/Yu_Cblog/article/details/132157187
Recomendado
Clasificación