All symbols in my libraries have a "PN" field. That field is populated with a "house" part number, which is a key in a database. (I do not use the Kicad standard libraries for production. When I create new parts, I do check those libraries to see if someone else already created them, and if so, I copy the symbols to my library and add the PN field.)
The part number is of a format:
A-1000-0
Where:
"A" is a letter indicating a broad category type. In my database, all 'A' parts are integrated circuits, so micros, op-amps, regulators, whatever. 'R' are resistors, 'C' are capacitors, 'D' are diodes, 'Q' are transistors, and so forth. (This prefix is NOT the reference designator prefix.)
"1000" is a "family" part number. For example, A-1091 is an OPA551 op-amp. C-1001 is an 0805 10% X7R 50V ceramic cap. D-1020 is an LED shaped for bar-graph meter displays.
The rule for a "family" is that the members of the family vary in only one parameter. For capacitors and resistors, the variant is obvious: the value. For that LED, it is the color. For that op-amp, it is the package (it's available in DIP and SOIC).
So the "-0" indicates the variant. This indicator could be just a different number to show the differences, so A-1091-0 is OPA551UA in SO-8 and A-1091-1 is OPA551PA in DIP-8. D-1020-0 is a green LED of that shape, D-1020-1 is red, D-1020-2 is yellow. (This suffix could have been -RED, -GREEN, -YELLOW but I didn't bother.)
And for things like resistors and capacitors, the suffix is simply the value. C-1001-10nF is a 10nF cap with all of the above specs. C-1001-470nF is a 470nF cap with those specs. C-1000-100pF is a 100 pF 5% 0805 C0G 50V cap. R-1000-10k0 is a 10.0k 0805 1% resistor. R-1000-29k4 is a 29.4k 0805 1% resistor. X-1009-24.576M is a 24.576 MHz 5x7mm 3.3V oscillator.
0.1% 0805 resistors are a separate family. 1% 0603 resistors are again a separate family. Remember again all members of a family vary in exactly one parameter, in this instance case size.
Many parts have only one family member so their suffix is simply -0.
So the answer to the OP's question: Resistors, capacitors, inductors and oscillators are the categories of parts where there are so many possible values of otherwise similar parts that you really want to have just one symbol for your "family" so you don't have say 500 0805 1% resistor symbols in the library. So the PN field for these parts has just the type and the family number, say C-1001. The value field must be populated with the part value, in a standard format.
All other part types need the full part number, so a Neutrik NC3FAH1 XLR connector's PN field is F-1000-0. I honestly don't have a problem with an op-amp library that contains two dozen different parts, each of which have the same symbol.
SO: Kicad exports a BOM in CSV. The BOM has all of the fields in each symbol, so my PN field along with the value field (and reference designators and footprint and everything else) is in it.
I maintain a master parts list, which is a simple spreadsheet. (One day I'll make it a true database.) This parts list is keyed by the part number. This means all 0805 1% resistors have an entry. Each entry has a symbol name, a manufacturer name, a complete manufacturer part number, the footprint, a description, a count of how many pieces I have in stock, and a rough price. (It also has the library in which the symbol lives, the library in which the footprint lives, and alternate vendor names and part numbers.) One good obvious rule is that part numbers once assigned are never re-used if the original part goes obsolete or whatever.
When I go to generate an order list I export this parts list as CSV. I wrote a python script that takes the Kicad CSV BOM and the parts list CSV and looks up each part in the former in the latter, and it generates a CSV parts list with manufacturer names, part numbers, quantity of each part, a list of reference designators for each part, and a rough price.
It's simple enough and meets my needs.
Obviously it can be improved in many ways. The master parts list could include a distributor's part number -- but why? They all let you enter manufacturer part number. It could use a real database instead of a spreadsheet. Some assembly places like Seeed have a spreadsheet format they prefer for assembly orders and an addition to the python script could generate that. The parts list could have a field indicating that the part is in an assembly house's preferred parts list and the script could flag parts not on that list.
But for now it suffices.
One important feature is that I shouldn't have to manually edit the BOM this system creates!