This can be difficult sometimes to be honest. I use database a lot, but rarely are they really that huge, not big as in lines, but big as in fields. Normally 5 or less tables.
But from my experience the more you can break up the tables the easier it is to expand a database and edit or maintain it later on. This might seem dumb, but imagine if all of those are in one table, it makes it super easy to use, but now what if you change tags to something else where you have 2 fields instead of 1 and so on. Or what if you have a system that still needs the old version of tags, but the new system doesn't use it, you can't just delete them now can you? Splitting it up allows you much more flexibility.
I would suggest the required information is in the main table and the rest is split up. This can slow down queries a little bit and be a bit more difficult to create proper queries if you are not as experienced, but well worth it when you start changing things in the long run.
items
- id
- name
- sku
- barcode
items_physical_properties
- id
- items_id
- width
- height
- weight
- quantity
- color
items_digital_properties
- id
- items_id
- tags
- image
items_information
- id
- items_id
- manufacturer
- manufactured_date
- vendor
- company
- created_date
items_pricing
- id
- items_id
- sell_price
- cost_price
items_sales
- id
- items_id
- sale_price
- start_date
- end_date
- amount_sold
I would split it up something like this, the reason is, let's say you create a third party api or idk a cash register it makes it a lot easier to limit what you give to them. This also makes it easier to limit what queries you make, lets use the cash register as an example. They don't need to know the manufactured_date, but maybe a guy in the backroom using a hand scanner does.
// my mysql is a bit rusty, but here is an example
// cash register
SELECT
items.id, items.name,
items_prices.sell_price,
items_sales.sale_price
FROM items
JOIN items_prices ON items.id=items_prices.items_id
JOIN items_sales ON items.id=items_sales.items_id
The hand scanner guy needs different information, while there are other ways of controlling this some databases let you control it buy the user who accesses them. It makes it much easier when working with third parties, or just personally mixing and matching queries.
You could even go more in-depth, but there is a point where it just creates more work for what little you get out of it. Not sure if this helps, but it is my experience using databases