Let’s say I am making an app that has table Category and table User. Each user has their own set of categories they created for themselves. Category has its own Id identity that is auto-incremented in an sqlite db.

Now I was thinking, since this is the ID that users will be seeing in their url when editing a category for example, shouldn’t it be an ID specific only to them? If the user makes 5 categories they should see IDs from 1 to 5, not start with 14223 or whichever was the next internal ID in the database. After all when querying the data I will only be showing them their own categories so I will always be filtering on UserId anyway.

So let’s say I add a new column called “UserSpecificCategoryId” or something like that - how do I make sure it is autogenerated in a safe way and stays unique per user? Do I have to do it manually in the code (which sounds annoying), use some sort of db trigger (we hate triggers, right?) or is this something I shouldn’t even be bothering with in the first place?

  • pe1uca@lemmy.pe1uca.dev
    link
    fedilink
    arrow-up
    3
    ·
    4 months ago

    Plus I’d suggest having a slug so the user doesn’t have to memorize a meaningless number, instead a similar sounding string.

    Instead of having 12345, something like category-1 for “Category 1”.
    Specially for sharing with a URL, it’s more meaningful to share " domain.tld/search/categories/cat-1" than any other form of id (I’m annoyed with lemmy for not having a slug for posts, it feels so shady to share anything haha)

    • CynoOP
      link
      fedilink
      arrow-up
      1
      ·
      4 months ago

      This is something I’ve been considering too, since the name is in this case unique per user I can just use it for everything in frontend rather than the ID. It’s not always a good solution though so I was wondering how would I solve it with IDs alone

      • pe1uca@lemmy.pe1uca.dev
        link
        fedilink
        arrow-up
        2
        ·
        4 months ago

        You shouldn’t use the name as a replacement for the ID, you need to use a slug.
        The name should be stored as the user sets it, and the slug is autogenerated by your code removing any problematic character, so usually it only contains letters, numbers, and dashes, which makes it perfect to be a substitute for the numeric ID.
        There should be libraries to handle this for you.

        And ID is just something to identify a resource, so your ID in this case would be the slug.
        I have a use case where the ID is generated by two fields, adapting it to your case would be something like /users/{user}/categories/{category}
        So, whatever you define to be a unique way of working with an entity will be the identifier (ID) of that entity.

        • CynoOP
          link
          fedilink
          arrow-up
          1
          ·
          4 months ago

          Good point, that sounds nicer than just encoding the name for sure, thanks