bitcoin core – Is it only out of sheer luck that all my “txid”s are unique? How should I handle multi-vout transactions?

I have created a database table simply copying the information from listsinceblock from Bitcoin Core’s API. I have a UNIQUE constraint set to “txid + vout”, as I’m supposed to. But when, as I’m trying to understand how Bitcoin works at least on a surface level, I do this:

SELECT txid, count(*) FROM "Bitcoin Core transactions" GROUP BY txid;

Then it is revealed that not one of my txids have more than one vout. The count column says “1” for each txid, meaning they all have only one vout.

I’ve made numerous Bitcoin transactions. Why has none of them ever used more than one vout? And what happens the day this happens? I’m using this table’s data in order to automatically update my separate bookkeeping of all my Bitcoin transactions (“transactions” here meaning actual transactions — not some internal “txid + vout” concept). I obviously don’t want some internal Bitcoin logic to result in two different “bookkeeping posts”, when it’s really just a single Bitcoin transaction!

I’m starting to wonder if I’m simply stupid for not understanding this, or if Bitcoin is deliberately designed to be as confusing as possible. How should I handle the possibility that there will at some point be one transaction which is listed as the same txid but multiple different vout ids?

If it weren’t for the fact that my future and survival is dependent on this, I would have long ago given up on Bitcoin and rejected it as “cryptic nonsense”. I don’t understand what the problem is with just having a clear interface for the actual Bitcoin transactions. I don’t care about some complex internal logic and don’t want to be exposed to it. I can’t escape the feeling of still having missed something important, in spite of all this endless reading and asking questions for years and years.

Using any kind of “intermediate” service or software would destroy the point of Bitcoin. Why can’t Bitcoin Core just clearly list the human-relevant information instead of exposing internal mechanisms to the “end user”/programmer? Or is it?