sql >> Database >  >> RDS >> Mysql

SQL efficiënt schema generatie-algoritme

Dit antwoord is alleen bedoeld als een oplossingsrichting voor het schemagedeelte, niet als een 100% mooie oplossing:

Wat je hebt gemaakt, heeft loops nodig om aan alle voorwaarden te kunnen voldoen.

Om zo'n geval sneller op te lossen, kan het praktisch zijn om in vectoren te werken waarin in de vector alle posities worden weergegeven door 0 (beschikbaar) en 1 (genomen).

Dus de student/wiskunde-1 kwestie:

Stel dat er 2 kamers en 3 uur zijn:De wiskunde-1 vector per kamer is dan:

Room 1: [0 0 0]
Room 2: [0 0 0]

In wezen (in ieder geval mij) maakt het niet uit of een bepaalde kamer beschikbaar is, zolang er maar 1 beschikbaar is:Dus een AND per index zou in dit geval het antwoord kunnen zijn voor beschikbaarheid (onthoud:0 is beschikbaar):

Kamer 1:[1 0 0]Kamer 2:[0 0 0]Ruimte resultaat:[1 0 0] AND [0 0 0]=[0 0 0]

Een AND kan dus zien of het eerste uur nog beschikbaar is.

Als je dit nu combineert met een student met de beschikbare uren (ook maar 3 voor dit voorbeeld):

Student A:[0 0 1]Ruimte resultaat:[0 0 0]Leerling matcht met kamer met behulp van een OR voor deze bewerking:[0 0 1] OR [0 0 0]=[0 0 1]

Dus leerling A komt overeen met het kamerresultaat.

In SQL:Het datamodel (onderdeel:Missing is the course match):Tafelkamer:

CREATE TABLE room(
room_id INT,
space TINYINT DEFAULT 0,
hour INT DEFAULT 1
);

CREATE TABLE student(
student_id INT,
space TINYINT DEFAULT 0,
hour INT DEFAULT 1
)

Alle gegevens zijn volledig in tabellen ingevoegd:in dit geval 1 kamer, 3 uur, 3 plaatsen beschikbaar.

INSERT INTO room VALUES (1,0,1);
INSERT INTO room VALUES (1,0,1);
INSERT INTO room VALUES (1,0,1);
INSERT INTO room VALUES (1,0,2);
INSERT INTO room VALUES (1,0,2);
INSERT INTO room VALUES (1,0,2);
INSERT INTO room VALUES (1,0,3);
INSERT INTO room VALUES (1,0,3);
INSERT INTO room VALUES (1,0,3);

Student heeft:

INSERT INTO student VALUES(1,0,1);   
INSERT INTO student VALUES(1,0,2);   
INSERT INTO student VALUES(1,1,3);   

De student is dus alleen de eerste twee uur beschikbaar.

Om nu een resultaat te krijgen van een zoekopdracht:

SELECT room_id
FROM room a
INNER JOIN student b ON a.space=b.space AND a.hour=b.hour;

Dit resultaat hoeft alleen te worden opgesplitst in de groepen van maximaal 8, waarbij het het einde van het SQL-gedeelte is en tijd voor een andere programmeertaal.

Dit model kan worden uitgebreid met een datum, maar het werkt het beste als u alleen uren en weekdagen gebruikt (beschikbaarheid op weekdagen is weer 0 of 1).

Zoals ik al zei:dit is een concept/idee, geen 100% oplossing, dus er moet wat aan gedaan worden voordat je het kunt gebruiken.....



  1. Leeftijd berekenen vanaf verjaardag met oracle plsql-trigger en de leeftijd in de tabel invoegen

  2. SQL Server 2016:altijd versleuteld

  3. Controleer of mysql-database bestaat, voer actie uit op basis van resultaat

  4. Tabellen en schema's opnemen bij het weergeven van de identiteitskolommen in een SQL Server-database