Eins-zu-viele-Beziehung im Vertrag

Wenn id(z. B.: 1) Feld in der Struktur nicht eindeutig ist und verschiedene Namen demselben zugeordnet werden id=1. Können alle zugeordneten Namen id=1aus der Blockchain abgerufen werden?

pragma solidity ^0.4.4;

 contract Register{

 struct Details{
  bytes id;
  string name;

  }
 mapping (bytes => Details) DetailsTable;

 function saveBondToBC(bytes id,string name) 
 payable returns(bool success){

DetailsTable[id].id = id;
DetailsTable[id].name = name;
return true;
}

function getAllNames(bytes id) return (string){
DetailsTable[id].name; //Return latest 'name' written
 }     

Antworten (2)

Mapping sind eindeutig (oder viele-zu-eins-Beziehungen im Fachjargon für relationale Datenbanken). Zum Beispiel, wenn die ID 123 dem Namen Vitalik zugeordnet ist. ID 123 kann nur zu Vitalik führen und kein anderer Wert ! Andere IDs (z. B. 947) können jedoch auch auf Vitalik verweisen (Viele-zu-Eins-Beziehung).

Wenn Sie die Zuordnung beispielsweise 123 => Vitalikauf aktualisieren 123 => Gavin, zeigt die ID 123 offensichtlich nur auf Gavin und Gavin.

Ich bin mir nicht sicher, ob es offensichtlich ist oder nicht, aber um der Klarheit willen, in diesen Zeilen

DetailsTable[id].id = id;
DetailsTable[id].name = name;

Sie aktualisieren Ihre Zuordnung überhaupt nicht, sondern nur die Felder in Ihrer Struktur. Auch wenn Ihre IDs zwei verschiedene Werte sind, würde ich bessere Namen finden. Wenn Ihre ID in der Struktur mit der ID für die Zuordnung identisch ist, hat es keinen Sinn, die ID erneut in der Struktur zu speichern (dies schafft Redundanz und fügt nur Overhead hinzu, um die beiden Werte synchron zu halten).

Sie können die Zuordnung auch nicht durchlaufen, ohne zu wissen, welche IDs initialisiert wurden (alle Zuordnungen sind gültig), wenn Sie Ihre IDs nicht verfolgen (entweder in Ihrem Smart-Contract oder außerhalb der Blockchain in einer Datenbank).

In Ihrem Smart Contract könnten Sie dafür ein Array erstellen

bytes[] allMyUniqueIds;

Wenn Sie dann überschleifen , erhalten allMyUniqueIdsSie Ihre gesamte DetailsStruktur zurück

Ja, ich könnte die ID in einem Array speichern. Aber was ich brauche, ist eine Eins-zu-Viele-Beziehung. Ist das irgendwie möglich?
Ja es ist möglich. Ich habe vor ein paar Tagen ein Beispiel geschrieben. Folgen Sie diesem Link ethereum.stackexchange.com/questions/37988/… und es gibt viele Beispiele da draußen :)

Danke, das hat bei mir funktioniert :)

struct IdStruct{

bytes12[] structArray; 
}

mapping(string => IdStruct) idStructs;

function appendNames(string id, bytes12 name) payable returns (bool success){ 
 idStructs[id].structArray.push(name); 
} 

function getName(string id) returns(bytes12[]){ 
return idStructs[id].structArray; 
}