There are several approaches, the selection depends on EEPROM size, maximum number of records (let's denote by N) and maximum size of a record (let's it be S):
First approach is pretty obvious: if (N * S) <= free EEPROM size, then you can just allocate equal blocks of maximum size for each record. For example, if EEPROM size is 2048, and each record is 31 bytes max, and there is no more than 64 records, you can allocate 64 records of 32 bytes each, using the first byte to denote the size of the record.
If the size of each record can vary in wide range, or total number is undefined (you want to fir as much as possible), then there is two fragmentation approaches:
1) Defragment the data. Each time there is no continuous block of required size is available, you'll move all the data, until there is a free block of required size.
For example if record size is varied within 127 bytes, you can use first one byte to denote the type and the size of the block. E.g. higher bit is 1 - when block is free, 0 - if it is contains data. Lower 7 bits contains the block size.
This approach is good enough, but since data is moved, it may require to update all references to the data in appropriate way.
2) Store the data fragmented. You can allocate number of blocks of particular size (e.g. 32 bytes each = 64 records max for 2048-bytes EEPROM). The first one will contain the index of the block where data is continued, let's say 0xFE is value for the last block in the chain, 0xFF - to denote the empty block. Other 31 bytes of the block to contain the data.
It may make the reading process slightly more complicated, but data location for each record will be unchanged for a whole period of time.