2010-07-12 3 views
2

Notre application immobilière a une table, Events, qui a historiquement été liée à la table Homes via une colonne Event.homes_id.MySQL/CakePHP DB Design Question

Récemment, pour la première fois, nous avons ajouté un type d'événement qui n'est pas connecté à un domicile, mais un agent immobilier. La question: est-ce une bonne pratique d'ajouter maintenant une colonne realtor_id à la table Events? Quelque chose en moi se rebelle à l'idée d'avoir deux colonnes, home_id et realtor_id pour chaque enregistrement, dont l'un sera toujours nul pour un enregistrement donné. Mon patron dit que c'est efficace et évite les frais généraux de création de nouvelles tables. Quels sont les droits et les torts de cette situation? Un corollaire à la question ci-dessus: une partie de notre réticence à créer de nouvelles tables est le fait que nous utilisons CakePHP, et qu'il devient donc plus difficile d'avoir un contrôle absolu sur plusieurs tables liées via des jointures SQL. (La définition de la propriété récursive de Cake au maximum réduit la vitesse de l'application à une analyse.) Est-ce que, et devrait, travailler avec Cake affecte les considérations de conception de base de données? Ou travaillons-nous simplement avec Cake?

+0

Je ressens votre douleur avec les malheurs récursifs de CakePHP. J'aime le cadre, mais il peut vraiment s'éloigner de vous si vous ne le regardez pas. Cela étant dit, une fois que vous apprenez les joies des jointures ad-hoc dans vos appels de recherche CakePHP, les choses deviennent un peu plus faciles à travailler. – Stephen

+0

Merci les gars pour quelques réponses vraiment intéressantes à la question, couvrant les deux côtés de l'argument - pragmatisme vs faire les choses de manière optimale. Nous avons fini par rester sur la voie pragmatique (coin-coupe?) - espérons qu'il ne nous mord pas dans le derrière à une date ultérieure! – thesunneversets

Répondre

2

Quelque chose en moi rebelles à l'idée de ayant deux colonnes, home_id et realtor_id pour chaque enregistrement, l'un des qui sera toujours nul pour tout enregistrement donné. Mon patron dit que c'est efficace et évite les frais généraux de en créant de nouvelles tables. Quels sont les droits et les torts de cette situation?

Eh bien, vous avez raison, c'est probablement moins efficace que l'optimal. Cependant, l'ajout d'une autre colonne (INT, pas moins) qui sera nulle 50% du temps ne va pas affecter l'efficacité globale de votre base de données.

OTOH, il va vous falloir un peu d'effort pour restructurer votre application. En ajoutant simplement cette colonne, vous mettez en place un hack.

Je pense que c'est acceptable pour cette situation, bien que vous ne pouvez pas aimer l'esthétique de celui-ci. Hey - personne n'aime les hacks. Cela augmente la "dette technique". Mais google autour de ce terme et vous verrez que beaucoup de gens disent embrasser dette technique, car il vous permet de continuer à aller de l'avant, plutôt que d'essayer de se concentrer sur la solution parfaite (qui vous échapper, malgré les meilleurs efforts).

C'est une décision commerciale - l'esthétique de votre schéma et de votre base de code vaut-elle le coût (votre taux horaire * # heures pour le réparer correctement)? Dans cette situation, je dirais que ce n'est probablement pas le cas.

+0

Il est vrai que tout fonctionne maintenant et peut-être que je devrais juste être reconnaissant pour cela! Cependant étant un programmeur très junior dans le grand schéma des choses, je veux toujours être sûr que je ne commets pas trop de crimes contre les meilleures pratiques ... toujours bon de faire passer les choses après la sagesse combinée de l'Internet! – thesunneversets

+0

+1 pour la dette technique et les philosophies de l'avenir. –

+0

L'accumulation de dettes techniques sans raison apparaîtra presque toujours et vous mordra dans le cul plus tard. – Kalium

2

Mon patron dit que c'est efficace et évite les frais généraux de création de nouvelles tables.

Cela me semble aussi incertain. Je pense que vous avez besoin d'un design différent.

Plus précisément, je considérerais avoir des événements appartenant à Homes and Realtors. En restructurant cela, vous évitez la question de l'unicité de deux identifiants. Je représenterais Realtors/Homes à des événements comme has_many et l'inverse en tant que multiple appartient à des relations si vous en avez réellement besoin.

+0

+1 Si les nouvelles tables sont en surcharge, je ne peux pas imaginer ce qu'il appelle les cerceaux que vous devez sauter afin de déterminer si un événement donné est associé à une maison ou un agent immobilier chaque fois que vous le récupérez. Modifier la cardinalité de vos relations impliquera un travail de migration des clés, mais devrait être facile pour le reste de la vie de l'application. –

+0

Il n'est pas * trop * difficile de trouver tout simplement des événements "où home_id = n" ou "où realtor_id = n", en ce moment de toute façon, mais je suis content que les gens partagent mes intuitions que c'est compliqué. Je n'arrive pas à visualiser comment refactoriser les relations: quelles colonnes other_table_id continueront à être nécessaires dans la table Events? – thesunneversets

+0

Sous le schéma que j'ai suggéré, aucun. – Kalium

1

"nous utilisons CakePHP, et il devient donc plus difficile d'avoir un contrôle absolu" - Pourquoi? Que perdez-vous en ajoutant une autre colonne?

Pas beaucoup. Fierté, peut-être. Toutes les applications ont des compromis quelque part et c'est un minuscule."(La définition de la propriété récursive de Cake au maximum réduit la vitesse de l'application à une analyse.)" - n'utilise pas de récursivité! Comportement Containable fait un bien meilleur travail et vous pouvez obtenir seulement les données que vous voulez, aussi profond que vous devez aller.

Je voudrais ajouter une autre colonne, optimiser avec containable et passer à des choses plus importantes.

+0

Wow, regards Containable * incroyablement * utile. Les choses qu'ils ne vous disent pas toujours quand vous débutez avec CakePHP ... – thesunneversets