Search code examples
joinoracle11gsql-server-2008-r2indexingrdbms

Ideal solution for the following case scenario in database


There are 50 exams to be written by around millions of students online, One person may or may not write more than one exam. A person can also write a single exam more than one time ( retries ) ..

So which of the below solution is better for this case, I am okay with a better solution than these two as well

Option 1. Store each exam in a single table :

Subject 1

+----------------+---------+
|   student id   |  Marks  |
+----------------+---------+
| 1              | 85      |
| 2              | 32      |
| 2              | 60      |
+----------------+---------+


Subject 2

+----------------+---------+
|   student id   |  Marks  |
+----------------+---------+
| 1              | 85      |
| 2              | 32      |
| 2              | 60      |
+----------------+---------+

Like above with each table will have the student id only if that particular person has taken that exam , and have multiple occurrences of the student id if he has taken it more than once.

Option 2 :

+----------------+---------+---------+
|   student id   | Subject |  Marks  |
+----------------+---------+---------+
| 1              | Subj1   | 85      |
| 2              | Subj1   | 32      |
| 2              | Subj1   | 60      |
| 1              | Subj2   | 80      |
| 3              | Subj2   | 90      |
+----------------+---------+---------+

with all the values in a single table.

Which is better in terms of performance and storage perspective.

My various que


Solution

  • I think the best here is following:

    1. Table STUDENT with information about students

    2. Table EXAM with information about exams

    3. Table EXAM_TRY with reference to STUDENT and EXAM tables, and fields DATE_OF_EXAM and RESULT_OF_EXAM

    4. 2 indexes on foreign keys in table EXAM_TRY

    5. Depending on situation - index on date field (for example, you would need it for planning work for examiners)