contract "controlling" other smart contracts is not exactly a good term. but form what i understand you are trying to make a master contract that uses other contracts and has elevated access to their stored data.
the idea is simple if you are making all of these contracts. You can implement an ownership mechanism (openZepplin
Ownable would be a good start) on each slave contract and after deployment, you can switch the ownership to the main contract.
In each slave contract, you can implement methods that read, modify and delete the data stored on each contract, these methods would be only accessible if the message sender (
msg.sender) is the existing owner stored in the contract. this way you can seal the ownership of any contract to the main contract.