Browse Templates/Asset Management

Asset Management

A comprehensive IT Asset Management (ITAM) database schema for tracking hardware, software, and equipment across an organization. Includes asset categorization, employee assignment tracking with check-in/check-out workflows, maintenance and repair logging, and vendor management. Suitable for IT departments, facilities management, or any organization that needs to track physical and digital assets throughout their lifecycle.

PostgreSQL5 tablesEnterprise
assetsit-managementinventorymaintenancevendorsenterprise
Created with ERD Studio

About this schema

assignments is a history, not a current-holder column. Each row has an assigned_date and a nullable returned_date, so an open assignment is one where the return is still null — and a laptop that passed through four people leaves four rows rather than one field overwritten four times.

The asset carries both an asset_tag and a serial_number because they come from different places. The serial is the manufacturer's and identifies the hardware; the tag is the organisation's own sticker and survives a motherboard replacement. Searching by either has to work, which is why both are columns.

depreciation_years sits on asset_categories rather than on the asset. Depreciation is an accounting policy about a class of equipment — laptops over three years, servers over five — so the schedule is defined once and every asset in the category inherits it.

Key relationships

asset_categories → assets
The category supplies the depreciation period, which with purchase_cost and purchase_date is enough to compute book value.
vendors → assets
Who supplied it, kept so a batch of failing hardware can be traced to a supplier rather than only to a model.
assets → assignments
One row per custody period, with returned_date null while the asset is out. The open row is the current holder.
assets → maintenance_logs
Every repair with its cost and who performed it, which is what makes total cost of ownership more than the purchase price.
assignments.assigned_to
A reference to a person that is not a foreign key here, because this schema models the equipment rather than the HR system.

Design decisions

Custody is a history table

A current_holder column on the asset would be one read and would answer nothing else: who had it when it was damaged, how long it sat unassigned, whether it was returned at all. The assignments table makes those queries trivial. The price is that finding the current holder is a filter on a null returned_date rather than a direct read, and nothing stops two open assignments for one asset unless a constraint is added.

Maintenance is logged with its cost

Storing only what an asset cost to buy understates what it costs to keep. Each maintenance row carries a cost and a performed_at, so the question a replacement decision actually depends on — are we spending more to repair this than to replace it — is a sum rather than an impression. It also makes a vendor's reliability measurable from rows.

assigned_to is not a foreign key

The people are in the HR system, not here, and duplicating an employee table would create records that are never updated when someone leaves. The honest cost is that nothing enforces the reference — an assignment can name someone who no longer exists, and listing everything a departing employee holds depends on matching an identifier this schema does not own.

Depreciation is a category property

Putting the schedule on each asset would allow per-item policies and guarantee inconsistency, since the same model bought twice would depreciate differently. Keeping it on the category means a policy change applies to the whole class at once. The limitation is that assets bought under an older policy are revalued by the change, so a finance system needs the schedule frozen per asset at purchase.

Tables in this template

asset_categoriesAsset Categories
5 cols
vendorsVendors
7 cols
assetsAssets
10 cols
assignmentsAssignments
7 cols
maintenance_logsMaintenance Logs
8 cols

Frequently asked

How do I find who currently holds an asset?
The assignments row for that asset where returned_date is null. If more than one exists, the data is wrong — a partial unique index on asset_id for unreturned rows is what prevents it.
Why store both an asset tag and a serial number?
The serial identifies the hardware to the manufacturer and changes if a part is replaced; the tag is the organisation's permanent label for the item. Audits are done with the tag, warranty claims with the serial.
How is current book value calculated?
From purchase_cost, purchase_date and the category's depreciation_years, usually straight-line. It is not stored, so a change to the category's schedule immediately restates the value of every asset in it.
What happens when an asset is retired?
status changes rather than the row being deleted. Disposal has to stay visible for audit, and deleting it would also orphan the maintenance and assignment history that justified the decision.
Does this cover software licences?
Only loosely. A licence has a seat count and a renewal date that physical equipment does not, so licences generally need their own table with an expiry — tracking them as assets works until the first renewal comes due.