Collider ran twice when the same script is attached to both gameobjects

I am working on a project where users would instantiate rain droplets at random location(using the same prefab), and while two rain droplets collide with each other, one of them is destroyed and the one that stays grows in scale.

There is a logical flaw in the code I have, which every rain droplet has a sphere collider and with the same code attached. When two rain droplets collide with each other, the same code will run twice which means both raindrops are destroyed.

My temporary hack to this is to compare two rain droplets’ y position and the one with larger y stays.
However, this will not scale because later on, I will be adding wind and changing their scale, x-axis and z-axis.

Is there a better approach to this problem? Can I use an empty object as all rain droplets’ parent and detect the collision only once?

Thanks a lot!

	void OnTriggerEnter(Collider other) {
		Vector3 updatedScale = new Vector3 ((transform.localScale.x + other.transform.localScale.x), (transform.localScale.y + other.transform.localScale.y), (transform.localScale.z + other.transform.localScale.z));
		Vector3 updatedLocation = new Vector3((transform.position.x + other.transform.position.x)/2, (transform.position.y + other.transform.position.y)/2, (transform.position.z + other.transform.position.z)/2);

		if (this.tag == "sm" && other.gameObject.tag == "sm" ) {
			if (this.transform.position.y > other.transform.position.y) {
				Debug.Log ("test-other");
				Destroy(other.gameObject);
				this.gameObject.transform.position = updatedLocation;
				this.gameObject.transform.localScale = updatedScale;
			} else if (this.transform.localScale.y < other.transform.localScale.y) {
				//Destroy (gameObject);
			} else {
			}
		}
	}

Unity assigns a unique ID to all gameobjects (GetInstanceID()). Just compare these two, and destroy the one with the smaller ID value.

You could also use the Observer pattern here. Every time a raindrop collides with another it sets off an event that tells a Game Manager that it collided with another droplet, including its own transform in the call. Both colliders will send their responses and destroy themselves. Each time the event is triggered check a static counter for the count being an even number, and instantiate a new object at double scale at the location of the last triggered event. It seems like overkill for a small problem but it opens up a management level that could easily implement a scorekeeper, an achievement system, etc.

public class RainDropManager : MonoBehaviour {

    private void RainDropCollisionEventHandler(Transform t) {
        if (RainDrop.RainDropCount % 2 == 0)
            Instantiate(t.gameObject, t.position, Quaternion.identity, t);
    }

    private void OnEnable() {
        RainDrop.RainDropCollisionEvent += RainDropCollisionEventHandler;
    }
}

public delegate void RainDropCollisionDelegate(Transform selfTransform);

public class RainDrop : MonoBehaviour {

    public static event RainDropCollisionDelegate RrainDropCollisionEvent;
    public static int RainDropCount{get;set;}

    private void OnTriggerEnter2D(Collider2D collision) {

        if (collision.tag == "RainDrop")
        {
            RainDropCount++;
            RrainDropCollisionEvent.Invoke(transform);
            Destroy(gameObject);
        }
    }
}