It depends, but I can give a suggestion:
Fixed Grid
Basically rather than have an object be positioned respective to another's,
we have all objects in the world be snapped to a Global Grid.
Logic wise, it would have every GameObject snapped to say, every 1f
of x/y axis.

Kind of like mine-craft, where every block is snapped to the World-Grid
Problem is, it really depends on your model/art and how freely you want a player to be able to snap stuff to anywhere.
With the solution to the latter having the Grid be more precise.
The project randomly selects a trunk, and each trunk has a specific place for fruit. What are your thoughts on setting a point on each trunk, so the fruit (another 3D object) can be snapped?
This can work, and some Colony building games use it too to prevent the player from putting an extension/add-on for a building anywhere.
The hard part is that this point shall change if the trunk scale or rotation changes.
When you scale/rotate a parent, the child object's position/rotation/scale will change respectively, so you do not have to worry about that.
But if that is not the intended effect, you can detach all child-objects first, then re-attach it later like so:
public void DoScalingRotation() {
List<Transform> children = new List<Transform>();
foreach (Transform child in gameObject.transform) {
// Add to a list to re-attach the child-object later
children.Add(child);
// Detach the child object
child.parent = null;
}
// DO YOUR SCALING/ROTATION HERE
// Re-attach child-object
foreach (Transform child in gameObject.transform) {
child.parent = gameObject.transform;
}
}
Which also raises the question, do you need to attach the object as a child?
At most it's for cleanliness-sake during debugging.