Live data from Hacker News

What is better: a lookup table or an enum type?

cybertec-postgresql.com

11–20 of 23 posts

Re: What is better: a lookup table or an enum type?

#11

From a maintainability standpoint lookup tables are miles ahead, but from a DX perspective there are a few cases where enums are nice. Honestly I probably would never use enums again, I feel like it's caused pain every time I've done it.

Enums are great if you're into json/jsonb custom logic and aggregates. It's quite cool to use the constraint system to impose checks on various JSON fields, especially if you're doing extension development, or packaging up procedures for downstream consumption.

Re: What is better: a lookup table or an enum type?

#14
I don't database, but I like to think I have some kind of intuition for storage space requirements, and this article was very confusing.

Ignoring the indexes and just focusing on the main table sizes reported, we have:

- String ("The frequent repetition of these names inflates the size of the table"): 392 MB

- Enum data type ("Internally, an enum type is stored as four-byte floating point number. So it saves space in the table [...]"): 338 MB

- Lookup table ("Also, since a smallint only occupies two bytes, the person_l table can potentially use less storage space than the other solutions"): 338 MB.

I just can't make sense of the numbers, especially given the authors comments that I've quoted.

Is this some kind of typo/editing fail?

Re: What is better: a lookup table or an enum type?

#16
post #9
post #8

Earlier quoted context omitted.

> everything should be represent as a relation > always use a table .. when its a choice Everything should be represented as relations (sets of tuples) but you should always use tables (multisets of tuples) when possible? That seems a little contradictory.

how do you want to represent relations in a DBMS, an enum or a table ?

with foreign keys?

Re: What is better: a lookup table or an enum type?

#17
post #14

I don't database, but I like to think I have some kind of intuition for storage space requirements, and this article was very confusing. Ignoring the indexes and just focusing on the main table sizes reported, we have: - String ("The frequent repetition of these names inflates the size of the table"): 392 MB - Enum data type ("Internally, an enum type is stored as four-byte floating point number. So it saves space in…

I'm also wondering about that. But maybe this could be it?

> Surprisingly, the table is just as big as with the enum type above, even though an enum uses four bytes. The reason is that each table row is aligned at a memory address divisible by eight, so PostgreSQL will add six padding bytes after the smallint. If we had more columns and could arrange them carefully, we could see a difference.

This could be the explanation. If the row is padded to 8, bigint is 8, then smallint or enum also use 8. The entries in the string table will be 8 or 16 due to the string length. So one row in person_e and person_l is 16, one row in person_s could be about 20 on average, that is a bit closer to the reality than my intuition, although the storage savings are still less than what I would have expected.

edit:

I did also try out the test and dropped the primary key on the table to compare only enum and string size:

  SELECT PG_SIZE_PRETTY(PG_RELATION_SIZE('person_e')), PG_SIZE_PRETTY(PG_RELATION_SIZE('person_s'))

  277 MB,330 MB
Does not look like an amazing saving either.

Re: What is better: a lookup table or an enum type?

#18
post #14

I don't database, but I like to think I have some kind of intuition for storage space requirements, and this article was very confusing. Ignoring the indexes and just focusing on the main table sizes reported, we have: - String ("The frequent repetition of these names inflates the size of the table"): 392 MB - Enum data type ("Internally, an enum type is stored as four-byte floating point number. So it saves space in…

> Enum type 4-byte floating point number

This is why the storage is weird. Why would you use a float for distinct number storage!

Re: What is better: a lookup table or an enum type?

#19
Honestly, the storage use would probably be the last thing of my mind when designing for "what should state/region/district/bundesland/etc. be modelled as". Sometimes those things get renamed, sometimes they are merged, and sometimes they are split. Which means that you may end up in an awkward state when e.g. Mecklenburg-Vorpommern gets split back into Mecklenburg and Western Pomerania, and some of your customers have updated their addresses, and some haven't. You have to store all of that anyway because remember: your DB doesn't represent the current state of the world, it represents your knowledge about the current state of the world (which is where the whole impetus for NULL originated: "I know that the customer has an address, I just don't know what it is", and all related problems with it: compare "I know that the customer actually does not have any address at all", and "I know that this address just can't be correct no longer but I have no new knowledge about what it can be").

Re: What is better: a lookup table or an enum type?

#20
post #9
post #8

Earlier quoted context omitted.

> everything should be represent as a relation > always use a table .. when its a choice Everything should be represented as relations (sets of tuples) but you should always use tables (multisets of tuples) when possible? That seems a little contradictory.

how do you want to represent relations in a DBMS, an enum or a table ?

If said DBMS is relational, with relations.

If said DBMS is tablational, like SQL, then you would have to approximate them using tables and constraints.

If said DBMS is of an another paradigm, like a document database, there may be no way to represent relations within the DBMS.

An enum is a construct that numbers things. There is no way to represent a set of tuples with an integer[1]. I'm not sure where you are trying to go with that one. Inversely, you could hold an enum generated value within a relation. Is that what you mean?

[1] Yes, technically you could break up the individual bits such that they form a set of tuples, but that wouldn't be useful beyond a very narrow use-case and doesn't generalize the way relation implies.

Post reply on HN