I am building an application that is using JSON / XML files to persist data. This is why I indicated “outside of SQL” in the title.

I understand one benefit of join tables is it makes querying easier with SQL syntax. Since I am using JSON as my storage, I do not have that benefit.

But are there any other benefits when using a separate join table when expressing a many-to-many relationship? The exact expression I want to express is one entity’s dependency on another. I could do this by just having a “dependencies” field, which would be an array of the IDs of the dependencies.

This approach seems simpler to me than a separate table / entity to track the relation. Am I missing something?

Feel free to ask for more context.

  • abbadon420@lemm.ee
    link
    fedilink
    arrow-up
    1
    ·
    5 months ago

    One example could be to add a value to the relationship, like a rating or a ranking.

    For example a Movie can be seen by many Users and a User can see many Movies. A user can rate the movie they’ve seen between 0 and 10. So, the join table would have 3 collumns:

    • he FK for User
    • the FK for Movie
    • the numerical value of the rating by that particular User for that particualr Movie.
  • kevincox@lemmy.ml
    link
    fedilink
    arrow-up
    1
    ·
    5 months ago

    There is no concrete difference between the two options. But in general they will be similar. I think you are talking about these options:

    struct Person;
    struct Skill;
    
    struct PersonSkills {
        person: PersonId,
        skill: SkillId,
    }
    

    vs

    struct Person {
        skills: SkillId[],
    }
    
    struct Skill;
    

    The main difference that I see is that there is a natural place to put data about this relationship with the “join table”.

    struct PersonSkills {
        person: PersonId,
        skill: SkillId,
        acquired: Timestamp,
        experience: Duration,
    }
    

    You can still do this at in the second one, but you notice that you are basically heading towards an interleaved join table.

    struct PersonSkills {
        skill: SkillId,
        acquired: Timestamp,
        experience: Duration,
    }
    
    struct Person {
        skills: PersonSkills[],
    }
    

    There are other less abstract concerns. Such as performance (are you always loading the list of skills, what if it is long) or correctness (if you delete a Person do you want to delete these relationships, it comes “for free” if they are stored on the Person) But which is better will depend on your use case.

  • Turun@feddit.de
    link
    fedilink
    arrow-up
    0
    ·
    5 months ago

    It depends entirely on how you want to work with the data.

    Have you considered sqlite? The database is just a single file, which gives you all the advantages of a text file (easy backup, sharing, easy editing via sqlite browser) while also providing the benefits of SQL when operating on the data (join, etc).

    • matcha_addict@lemy.lolOP
      link
      fedilink
      English
      arrow-up
      0
      ·
      5 months ago

      Sqlite is nice but the file would not be readable in a plaintext-like format from my understanding.

      • Turun@feddit.de
        link
        fedilink
        arrow-up
        1
        ·
        5 months ago
        1. Yes, but devil’s advocate: you also need a program to text files, needing a program to read sqlite files is not worse.

        2. I am confused by your requirements. Why do you need to store your data as json or XML? Would it suit your requirements to read in text files, convert to sqlite for processing and then save as a text file? What do you gain by being able to edit the files in a text editor, as opposed to a table editor? Do you maybe just need a config file (e.g. in toml format) and don’t actually do much data processing?