0

J'ai un modèle de livre et un modèle de notes. Chaque livre peut avoir plusieurs notes.Ressource avec un seul attribut. Signe que quelque chose sent?

# note.rb 
id | book_id | content | page_number | author_id | 

Je veux lancer un grand nombre de requêtes comme

  1. Obtenez toutes les notes pour la page 43 d'un certain livre
  2. Afficher toutes les pages notées d'un certain livre

Ces types de requêtes semblent favoriser la création d'un modèle distinct_pages distinct, de sorte qu'un livre peut contenir plusieurs pages et chaque page indiquée peut contenir plusieurs notes. C'est bien, mais ma table noted_pages aurait en fait juste une colonne id et une colonne page_number qui ne me conviendrait pas.

Existe-t-il un moyen plus standard d'implémenter ce type d'installation ou est-ce que je suis d'accord?

Répondre

1

Une table noté_page relierait les notes aux pages, mais avez-vous besoin d'une table de pages?

Si vous avez besoin d'une table de pages, alors oui, vous vous souciez de la relation de type plusieurs-à-plusieurs et créez une table de liens. Si vous n'avez pas besoin de stocker book_pages en tant que lignes d'une table, alors ne le faites pas.

Votre conception: id | book_id | contenu | page_number | author_id |

vous donnera les réponses que vous voulez en questionnant comme ceci:

  1. obtenir toutes les notes de la page 43 d'un certain livre

    select * de la note où book_id = 123 et PAGE_NUMBER = 43;

  2. Afficher toutes les pages notées d'un certain livre

    select PAGE_NUMBER, count (id) de la note où book_id = 123 groupe par PAGE_NUMBER;

Si les performances posent problème, placez un index sur le numéro de page. Vous pouvez aussi faire (id, book_id, page_number) dans une clé composite, ainsi vos données seront stockées (note 3, livre 123, page 43).

+0

La plupart des réponses à cette question m'ont aidé avec mon problème mais j'accepte celui-ci parce qu'il décrit le mieux ce que j'ai fini par faire et je suis content de la solution. –

0

Si vous voulez une relation plusieurs à plusieurs, comme dans un livre peut avoir beaucoup de notes, et les notes peuvent avoir beaucoup de livres, vous devez avoir une table de jointure comme vous l'avez indiqué.

Il ressemblerait à ceci:

noted_page 
-------------- 
id book_id note_id 

Ceci est juste pratique générale, chaque fois que vous avez plusieurs-à-plusieurs, vous devez avoir une table de jointure.

(Certains cadres/ORM de ne pas vous obliger à avoir une colonne id, mais pour autant que je sache, Rails/ActiveRecord ne l'exige.)

+0

Ce n'est pas vraiment une relation de plusieurs à plusieurs que je vais pour. Chaque note ne serait jamais associée à un livre. Ma question est vraiment de savoir si cela vaut la peine de définir le modèle additional_pages supplémentaire ou est-ce que je peux utiliser des étendues ou d'autres techniques à mon avantage? –

0

Pas de design est mauvais ... il faut juste être justifié.

Je vois différentes solutions:

  1. A BOOK {titre, auteur, edited_date ...} a beaucoup PAGE {content} {has_many NOTES note_content}
  2. A BOOK {contenu, titre, auteur, edited_date ...} {has_many NOTES note_content, PAGE_NUMBER}

Cela dépend de la façon dont vous travaillez l'esprit h le livre. Avez-vous l'intention d'enregistrer le contenu du livre par pages ou non? Si non, alors pouvez-vous trouver la page, et donc les notes?

En ce qui concerne vos questions:

  • Un modèle avec un attribut est pas le signe qu'il « sent ». Vous pouvez même avoir une relation 1-à-1, si c'est justifier.
  • Il n'y a pas de façon "standard" d'implémenter des choses. Comme je l'ai dit, cela dépend de la façon dont vous travaillez, de la façon dont vous prévoyez que vos utilisateurs l'utiliseront (UI-wised), comment vous stockez, etc ...
  • Vous n'aurez certainement pas besoin d'un grand nombre de beaucoup dans votre cas ... les rails fournissent suffisamment d'outils pour aller d'un modèle à ses associations, w/w/o conditions, etc ...

Faites-moi savoir si ça aide.

+0

Je quitte internet à cause de cette downvote inexpliquée. –

+0

Je n'ai pas baissé la note, mais je suppose que quelqu'un s'est opposé à "Aucun design n'est mauvais, il doit juste être justifié." Il y a * beaucoup * de mauvaises conceptions - des conceptions vraiment misérables, mortes de cerveau - dehors dans la nature. Probablement des millions d'entre eux. –

+0

Aucune idée pourquoi vous avez décroché. J'ai trouvé votre réponse utile. –

0

Ces deux éléments peuvent être de simples requêtes Arel, aucune portée est nécessaire

Ce dernier celui-ci est une simple vérification de l'existence de la collection Notes:

@book.notes.empty? #if there are no notes, it'll return true and vice versa 

Pour obtenir les notes de livre pour un certaine page:

@book.notes.where(["page_number = ?", page_number]) #where page_number is a variable, possibly a parameter 

Cependant, je pense que vous devez réfléchir à la façon dont vous allez modéliser vos données. Marcel a un bon point.

0

Votre conception est bonne. Ne pas trop normaliser. Vous voudrez probablement juste mettre un index sur book_id, page_number sur votre table de notes afin que vous puissiez faire la recherche efficacement.

Questions connexes