Progettare le mie classi con le relazioni

4

Ho bisogno di costruire un'interfaccia utente per inserire valori nel database. Sono bloccato con il mio design di classe per realizzarlo.

Ho bisogno di un'interfaccia utente in cui sia possibile inserire il nome del sistema. Ogni sistema può avere molte opzioni. Ogni opzione è associata a un TC (Chara tecnico). Ogni TC ha un altro insieme di valori che è descritto come TCset. Ad esempio, supponiamo che Tcset per un TC (TC1) abbia valori: TC1.1, TC1.2, TC1.3. (Ci sono altre variabili che descrivono ogni riga nel TCset, ho menzionato la proprietà name da sola per semplicità.Ora di nuovo tornando al sistema, l'opzione definita in ogni sistema può avere più valori di opzione.Per ogni valore di opzione dovrei essere in grado di inserisci un valore per la proprietà name in TCset associato al TC di tale opzione.)

Quello che vorrei ottenere sarebbe qualcosa di simile a questo.

Aggiunta di un sistema e definizione delle opzioni:

Aggiunta di valore per Opzione e valore per SetVal:

Sulla base della mia comprensione, ho progettato il seguente diagramma di classe. Ma ancora non riesco a trovare la mappatura esatta tra l'opzione e SetVal. Non riesco a progettare una classe in cui potrei aggiungere valori per Tcset in una particolare opzione

public class Lsystem
{
    public int LsystemID { get; set; }
    public string LsystemName { get; set; }
    public virtual ICollection<Option> Options { get; set; }
    public int OptionId { get; set; }

}


public class Option
{
    public int OptionID { get; set; }
    public string OptionName { get; set; }
    public int TCID { get; set; }
    public virtual TC tc { get; set; }
    public virtual Lsystem Lsystem { get; set; }
    public int LsystemID { get; set; }
    public virtual ICollection<OptionValue> OptionValues { get; set; }
}


public class OptionValue
{
    public int OptionValueID { get; set; }
    public string ValName { get; set; }
   //public int TCsetID { get; set; }
    public int OptionID { get; set; }
    public int SetValID { get; set; }
    public virtual Option Option { get; set; }
  //public virtual TCset TCset { get; set; }
    public virtual SetVal SetVal { get; set; }
}

public class TC
{
    public int TCID { get; set; }
    public string TCName { get; set; }
    public virtual ICollection<TCset> TCsets { get; set; }
}

public class SetVal
{
    public int SetValId { get; set; }
    public double Value { get; set; }
    public int OptionID { get; set; }
    public int TCsetID { get; set; }
    public virtual OptionValue OptionValue { get; set; }
    public virtual TCset TCset { get; set; }
}

public class TCset
{
    public int TCsetID { get; set; }
    public string TCsetName { get; set; }
    public string PhysicalUnit { get; set; }
    public int TCID { get; set;}
    public virtual TC TC { get; set; } 

}

C'è qualcosa che mi manca per farlo bene. Ma il modello di classe corrente non funziona perché i conflitti di chiavi esterne. Questo mi ha fatto aggiungere un'altra classe SetVal ma non ha risolto il mio problema. Ho provato molto per ottenere tutte le relazioni giuste ma non ha funzionato.

Solo per un briefing, le relazioni che ho usato qui:

  System - Option : One to Many
  Option - OptionValue : One to Many
  Option - TC : Many to One
  TC - TCset : One to many
  OptionValue - SetVal : One to One
  TCset - Setval : One to One

Modifica

Il punto in cui sono bloccato sta generando una tabella che accetta l'id del valore dell'opzione e offre un'opzione per aggiungere valori per il tcset.

In base al valore dell'opzione Ab1, ho bisogno di una tabella per dare valori come il seguente

Valore opzione Ab1

ABC1 - 45 ABC2 - 34

Opzione Valore Pq1

PQR1 - 67 Pqr2 - 34 pqr3 - 56

Valore opzione Pq2

PQR1 - 67 pqr2 - 34 pqr3 - 67

Questa connessione è ciò che mi manca. me ne sono reso conto quando stavo cercando di creare tabelle come è stato fatto nella risposta

Modifica: 2 Aggiunta di un esempio

     +--------------------------+
     |  SystemId  | System Name |
     +------------+-------------+
     |     1      |   DCC - 050 |
     |____________|_____________|
     |     2      |   DCC - 070 |
     |____________|_____________|

     ____________________________
     |  TCID      | TCName      |
     |____________|_____________|
     |    1       | Screw       |
     |____________|_____________|
     |    2       |  Motor      |
     |____________|_____________|

     __________________________________________________________
     | TCSetID   | TCsetname|PhysicalUnit | DataUsage | TCID   |
     |___________|__________|_____________|___________|________|
     |    1      | speed    | m/sec       | Prelimina |   1    |
     |___________|__________|_____________|___________|________|
     |    2      | d_0      | mm          | final     |   1    |
     |___________|__________|_____________|___________|________|
     |    3      | d_1      | m           | final     |   1    |
     |___________|__________|_____________|___________|________|
     |    4      | torque   |  mm         | final     |   2    |
     |___________|__________|_____________|___________|________|


     ____________________________________
     |OptionID | SystemID | TCID |OpName |
     |_________|__________|______|_______|
     |    1    |     1    |  1   |Screw  |
     |_________|__________|______|_______|
     |    2    |     1    |  2   |Motor  |
     |_________|__________|______|_______|

     _______________________________________________
     |OptionvalID | SystemID|OptionID | OptionValue|
     |____________|_________|_________|____________|
     |    1       |    1    |    1    |    01      |
     |____________|_________|_________|____________|
     |    2       |    1    |    1    |    02      |
     |____________|_________|_________|____________|
     |    3       |    1    |    1    |    03      |
     |____________|_________|_________|____________|
     |    4       |    1    |    2    |    01      |
     |____________|_________|_________|____________|
     |    5       |    1    |    2    |    02      |
     |____________|_________|_________|____________|

Ora il problema principale è che voglio dare valori per TCsetname in ogni opzione. La mia tabella risultante sarebbe la seguente (Questo non è lo schema del database)

VITE

     __________________________________________
     |TCSet |     01   |    02    |    03     | => Option values for Screw
     |______|__________|__________|___________|
     |speed |    12    |    14    |     16    |
     |______|__________|__________|___________|
     |d_0   |    34    |    56    |     56    |
     |______|__________|__________|___________|
     |d_1   |    2     |     5    |     6     |
     |______|__________|__________|___________| 

MOTOR

     ______________________________
     |TCSet |     01   |    02    | => Option Values for the Option Motor
     |______|__________|__________|
     |Torqu |    12    |    14    |     
     |______|__________|__________|

Sto cercando di correggere il datamodel che accetta l'ultima tabella

    
posta Vini 24.09.2015 - 13:23
fonte

2 risposte

1

User story

In base alla mia attuale comprensione del tuo programma, si tratta di informazioni su vari sistemi, in cui diversi sistemi possono avere proprietà diverse. Ogni proprietà ha un insieme limitato di valori possibili. Tuttavia, gli utenti devono essere in grado di definire nuove proprietà e devono essere in grado di modificare il loro insieme di valori possibili.

Supponiamo che lo useremo per tenere traccia delle parti del motore di riserva, solo per rendere le cose più concrete. Praticamente ogni parte di ricambio (sistema) ha un nome e un produttore. Per alcune parti è importante conoscere il loro peso, mentre per gli altri è necessario conoscere il loro colore. Finora, abbiamo 4 proprietà diverse: Nome, Produttore, Peso e Colore (ma supponiamo che ogni parte abbia un nome, quindi è l'unica proprietà che non sarà configurabile).

Supponiamo anche che abbiamo a che fare con 2 diversi produttori (Wheeler e BigCorp), solo 3 classi di peso (Leggero, Medio e Pesante) e 3 diversi colori (Rosso, Blu e Verde).

Il pezzo di ricambio 'Large wheel' è fatto da Wheelers e ha un peso Medio, ma non ci interessa il suo colore. La parte di ricambio 'Front window' è fatta da BigCorp ed è verde, ma non ci importa del suo peso.

Schema del database

Abbiamo bisogno di memorizzare le informazioni sulle opzioni e i loro valori disponibili (Produttore - > Wheelers e BigCorp, Peso - > Leggero, Medio e Pesante, Colore - > Rosso, Blu e Verde). Questo è quello che ho chiamato 'blueprint data'. Descrive quali opzioni e valori possono essere scelti da un utente, ma non memorizzano alcun dato di sistema effettivo.

option table:
+----+--------------+
| id | name         |
+----+--------------+
| 1  | Manufacturer |
| 2  | Weight       |
| 3  | Color        |
+----+--------------+

option_value table:
+----+-----------+----------+
| id | option_id | value    |
+----+-----------+----------+
| 1  | 1         | Wheelers |
| 2  | 1         | BigCorp  |
| 3  | 2         | Light    |
| 4  | 2         | Medium   |
| 5  | 2         | Heavy    |
| 6  | 3         | Red      |
| 7  | 3         | Blue     |
| 8  | 3         | Green    |
+----+-----------+----------+

Abbiamo anche bisogno di memorizzare informazioni sui sistemi attuali, quali proprietà sono rilevanti per loro e quali valori sono selezionati per quelle proprietà ('Large Wheel', fatta da Wheeler, Medium weight e 'Front window', fatta da BigCorp, Colore verde).

system table:
+----+--------------+
| id | name         |
+----+--------------+
| 1  | Large wheel  |
| 2  | Front window |
+----+--------------+

system_property table:
+-----------+-----------+-----------------+
| system_id | option_id | option_value_id |
+-----------+-----------+-----------------+
| 1         | 1         | 1               | // Large Wheel is made by Wheelers
| 1         | 2         | 4               | // Large Wheel has Medium weight
| 2         | 1         | 2               |
| 2         | 3         | 8               |
+-----------+-----------+-----------------+

Codice

Possiamo rappresentarlo con le seguenti classi:

public class Option
{
    public string Name { get; set; }
    public ICollection<OptionValue> AvailableValues { get; set; }

    // Database-related fields:
    public int ID { get; set; }
}

public class OptionValue
{
    public string Value { get; set; }

    // Database-related fields:
    public int OptionID { get; set; }
    public int ID { get; set; }

    // Parenting:
    public Option Parent { get; set; }
}

public class System
{
    public string Name { get; set; }
    public ICollection<SystemProperty> Properties { get; set; }

    // Database-related fields:
    public int ID { get; set; }
}

public class SystemProperty
{
    public Option Option { get; set; }
    public OptionValue SelectedValue { get; set; }

    // Database-related fields:
    public int SystemID { get; set; }
    public int OptionID { get; set; }
    public int OptionValueID { get; set; }

    // Parenting:
    public System Parent { get; set; }
}

Conclusione

Osservando lo screenshot, avresti anche bisogno di una proprietà IsEnabled in SystemOption . Mancano anche unità fisiche e valori di double , ma non mi è chiaro dove dovrebbero essere contenuti. Tuttavia, quanto sopra contiene solo 4 classi rispetto a 6, e le relazioni emergenti sembrano abbastanza semplici:

  • Il programma può contenere più opzioni, in cui ogni opzione può avere più valori possibili.
  • Il programma può anche contenere più sistemi, in cui ogni sistema può avere più proprietà.
  • Una proprietà si riferisce a un valore specifico per un'opzione specifica.

Ho anche dato nomi diversi a poche cose, che spero chiariscano parte della confusione.

    
risposta data 25.09.2015 - 15:38
fonte
1

Immagino che quello che stai cercando di fare sia usare il tuo modello per descrivere sia i metadati che i dati per i tuoi sistemi.

Quindi, il Sistema 1 ha diverse opzioni, come Motore primario, Motore secondario e Trasmissione Un'opzione ha un tipo (quello che stai chiamando TC), quindi Motore primario e Motore secondario sarebbero entrambi motori, mentre la trasmissione potrebbe essere TransmissionType Ogni tipo ha caratteristiche: il motore potrebbe avere potenza e coppia; La trasmissione potrebbe avere il numero di velocità / rapporti e frizioni.

Ora vuoi definire i valori per ogni opzione nel Sistema 1: Il motore primario ha una coppia di 200 CV e 180 libbre / piedi. Il motore secondario ha una coppia di 80 CV e 120 Nm / ft. La trasmissione è a 1 velocità con 1 frizione.

System
___________________
| ID | System_Name |
|____|_____________|
|  1 | System1     |
|____|_____________|

Option_Type (TC)
_________________________
| ID | Name              |
|____|___________________|
|  1 | Motor Type        |
|____|___________________|
|  2 | Transmission Type |
|____|___________________|


Type_Characteristics (TC_SET)
_____________________________________________
| ID |  TC_ID  | NAME           |  UNIT_TYPE |
|____|_________|________________|____________|
|  1 |  1      | Horsepower     |   HP       |
|____|_________|________________|____________|
|  2 |  1      | Torque         |   lb/ft    |
|____|_________|________________|____________|
|  3 |  2      | Clutch Count   |   clutches |
|____|_________|________________|____________


OPTION
________________________________
| ID | Name            |  TC_ID |
|____|_________________|________|
|  1 | Primary Motor   |   1    |
|____|_________________|________|
|  2 | Secondary Motor |   1    |
|____|_________________|________|
|  3 | Transmission    |   2    |
|____|_________________|________|


Option_Values
_______________________________________
| ID | OPTION_ID |  TC_SET_ID | VALUE  |
|____|___________|_____________________|
|  1 |      1    |      1     |   200  |
|____|___________|____________|________|
|  2 |      1    |      2     |   180  |
|____|___________|____________|________|
|  3 |      2    |      1     |    80  |
|____|___________|____________|________|
|  4 |      2    |      2     |   120  |
|____|___________|____________|________|
|  5 |      3    |      3     |    2   |
|____|___________|____________|________|

Ciò che non accadrà qui è il database che impone che l'opzione Motore primario abbia solo valori per i valori TC_SET_ID 1 e 2, che invece devono essere applicati nel codice. Tuttavia ti dà i mezzi per costruire la tua interfaccia utente:

L'utente sceglie un sistema, un modulo viene creato per ogni opzione, in cui richiede l'immissione di un valore Option_Value per ogni Type_Characteristic associato al Option_Type associato a tale opzione.

    
risposta data 26.09.2015 - 00:40
fonte

Leggi altre domande sui tag