Concrete data types for raw data organized in one or more columns of one or more tables may be determined. Functional data types for the one or more columns may be determined based on the raw data and the concrete data types such that a portion of the one or more columns may be associated with an identifier data type. Relationships between the one or more tables may be determined based on the portion of the one or more columns associated with the identifier data type. A schema representing the raw data may be generated based on the one or more relationships and the one or more tables.