Either of the ways is acceptable but multiple smart contracts are always preferable. If you are using a single smart contract, you can have a data structure to map the ID of the item to its current position in the supply chain . You can have a simple mapping from an integer for this. This approach gets complicated if you want to track all previous locations of a particular item. Also, any error in the contract would render the entire program unusable and since everything on a blockchain is immutable, it would ALWAYS be there.
The best approach would be maintain separate smart contract for each item.In each contract you can have a mapping from timestamp/string to a struct to store details of the item. Moreover, you'd need to alter only a particular contract in case of any discrepancies.