Memorizzazione in relazioni MySQL tra diversi tipi di oggetti

4

Ho un'app che deve allegare oggetti di diverso tipo tra di loro. Ad esempio: devo aggiungere Lead type object a un oggetto di tipo Contact , a Contact a Event e così via.

Tale relazione mi sembra un grafo non orientato (Se Car A è associato a Contact B ha lo stesso significato con Contact B è considerato come allegato a Car A ).

Car A edge Contact B significa due cose: - Car A è associata a Contact B - Contact B è associato a Car A

Questi due significati non sono indipendenti, sono lo stesso "business", solo un diverso punto di vista

Domanda : qual è il modo migliore per archiviare tali relazioni in un database SQL (MySQL - il mio caso)

Sidenote : utilizzo Eloquent ORM (Laravel / PHP) e uso una tabella pivot (per molti e molti tipi di relazione) per ogni tipo di relazione funziona parzialmente, in quanto non funziona quando provi per creare una relazione tra gli stessi oggetti: Contact <-> Contacts

    
posta user237329 04.08.2016 - 17:30
fonte

1 risposta

1

È possibile avere una relazione tra oggetti nella stessa tabella.

Ad esempio, ho una tabella services e i servizi possono avere una relazione BelongsToMany con uno o più altri servizi. Come un servizio di database è una dipendenza per il servizio CRM e il servizio finanziario, ma richiede anche i servizi di archiviazione e di rete.

Utilizza una tabella pivot, come la seguente:

Schema::create('service_dependencies', function (Blueprint $table) {
        $table->engine = 'InnoDB';

        $table->integer('service_id')->unsigned();
        $table->integer('dependency_id')->unsigned();
        $table->foreign('service_id')->references('id')->on('services');
        $table->foreign('dependency_id')->references('id')->on('services');
        $table->string('type');
        $table->primary(array('service_id', 'dependency_id', 'type'));
        $table->timestamps();
    });

Puoi vedere che sia service_id che dependency_id sono effettivamente id sulla tabella services .

Il modello Service ha il seguente aspetto:

public function get_supported_services() {
    return $this
        ->belongsToMany('App\Service', 'dependency_service', 'service_id', 'dependency_id')
        ->withPivot('type')
        ->wherePivot('type','supports')
        ->orderBy('service_short_name');
}

public function get_required_services ()
{
    return $this
        ->belongsToMany('App\Service', 'dependency_service', 'service_id', 'dependency_id')
        ->withPivot('type')
        ->wherePivot('type','requires')
        ->orderBy('service_short_name');
}
    
risposta data 30.09.2016 - 14:11
fonte