In my first project, I designed an xml based system to keep my item definitions. It sort of works, but it takes some work to create new items, because the process is manual. Also requires to load all item prefabs from Resources folder, on runtime. Advantages: it is kinda flexible, not all register must have the same attributes.
For my second project, I decided to take a more "proffesional" aproach, and choose to use ScriptableObject to store the information. Soon I realized that having several different kind of items (weapons, armor, implants), the definition would be a hughe data structure with lots of info, some of them irrelevant for some items (an armor doesnt does damage, or has range, or requires ammunition). The other choice was to have separate definition classes for each item type, and one database for each type: a list of weapons, a list of armor, etc.
My solution for this was to use a property system, which I already tested in my previous project: each item can have a list of properties, like damage, protection, bonus, a subtype like damage type, protection type, affected skill, and a value. I would like to hear some suggestions about how to improve this idea, or if there is any better solution.