Quale design migliore quando usi una chiave esterna invece di una stringa per memorizzare un elenco di id

4

Sto costruendo un sistema di esami online. Ho progettato di presentare tabelle, Question e GeneralExam . La tabella GeneralExam contiene informazioni sull'esame come nome, descrizione, durata, ...

Ora vorrei progettare la tabella GeneralQuestion , conterrà gli ID di domande che appartengono a un esame generale.

Attualmente, ho due idee per progettare la tabella GeneralQuestion:

  1. Avrà due colonne: general_exam_id, question_id.
  2. Avrà due colonne: general_exam_id,
    list_question_ids (stringa / testo).

Mi piacerebbe sapere quale progettazione è migliore, o pro e contro di ogni progettazione.

Sto usando il database Postgresql.

    
posta Thanh 16.11.2012 - 12:14
fonte

2 risposte

5

Il primo design è il migliore.

Questo perché puoi anche creare chiavi esterne alle domande. Inoltre non hai ulteriori elaborazioni per analizzare l'elenco degli id. Anche in questo caso hai la possibilità di ottenere tutte le domande insieme alla domanda generale di esame (solo una andata e ritorno al database).

Nel secondo caso è necessario ottenere la voce del database per un esame generale, analizzare il testo e quindi interrogare nuovamente il database per le domande ...

    
risposta data 16.11.2012 - 12:34
fonte
3
  • Domanda piacevole e ingannevole

Dipende dall'uso. Ma la maggior parte delle volte il tasto INT è preferito. Di solito troverai qualcosa come ID per mostrare la chiave primaria.

In definitiva dipende dall'utilizzo. Che tipo di requisiti hai intenzione di avere. Di conseguenza decidere. Ma l'INT è il più preferito. Qui ho spiegato entrambi

Per ID int (prima opzione) #

Il campo identità dovrebbe essere numerico e non basato su stringhe, perché

  • Risparmio di spazio (Un int è 4 byte, una stringa può essere il numero di byte che desideri. Per questo motivo, un int funzionerà sempre meglio)
  • Motivi prestazionali (le chiavi corrispondenti sulle stringhe sono più lente della corrispondenza su numeri interi
  • La ridondanza dei dati sarà risolta dalla colonna int. Come le chiavi esterne devono essere aggiornato (e / o cancellato) ogni volta che i dati vengono aggiornati.
  • Gli aggiornamenti / cancellazioni su una chiave esterna possono essere impostati su cascata.

Per stringa / testo (seconda opzione) #

  • L'uso di una chiave esterna significa che per ottenere dati leggibili dall'utente (es testo) deve essere fatto un JOIN Usando una chiave esterna descrittiva, non JOIN deve essere fatto per ottenere dati leggibili dall'utente. Questo include la lettura con SELECT e quando INSERIRE o modificare i dati. Ad esempio, a inserire in AddressNum è necessario groupId.
  • Dati leggibili dall'uomo nel database. Questo renderà più facile per il DBA per eseguire il debug dei problemi relativi ai dati, in quanto è possibile utilizzare una TABELLA CREAZIONE SHOW per trovare i riferimenti di chiave esterna e quindi ottenere un campione di dati da uno tabella e capire lo scenario, senza dover unire.

Mi piace il commento di @ user1598390

OP is not asking whether to use int IDs or String IDs. He/she is asking whether to used int IDs (one to many) or having all questions IDs concatenated in a text column like "123311;121322;123455;123487".

Prima opzione ho preso come ID int e seconda opzione che ho preso come testo / stringa.

Dipende dall'uso. Che tipo di requisiti hai intenzione di avere. Di conseguenza decidere. La maggior parte delle volte è preferibile la prima opzione. In questo caso, per la prima opzione non hai ulteriori elaborazioni per analizzare l'elenco di id.

    
risposta data 16.11.2012 - 12:52
fonte

Leggi altre domande sui tag