• OK - From what I've understood.

    Each Status has a set of common columns, which might include who changed it to that status, when the change happened etc.

    These common columns are the same for all the status changes.

    So what I would do is to capture is the details of a status change for the object.

    So separate those out into a separate table along the lines of

    Table ProductStatusChange

    ProductId (FK to Product)

    StatusType (Either a foreign key to a validation table of acceptable Statuses or the actual Status)

    ChangeDate (Date the status was changed to the value above)

    Accepted

    Rejected

    AcceptedBy

    AcceptedDate

    RejectedBy

    RejectedDate

    NumRejections

    Sent

    ExpectedSendDate

    SendDate

    That will shrink your table some and allow addition of new Statuses.

    Things like TimeToCut are actually attributes of the product and should remain keyed by the product.

    If there are a significant number of columns that are not frequently accessed then I would consider splitting the Product table into Product and ProductExtension, but only if this would either simplify my life (big tables are a pain) or cut down on I/O (huge text blocks that aren't used much).