¿Pero y ya realizaste el modelo conceptual, o aunque sea un modelo EER?
De manera esquematica, se te clarificarian bastante las cosas, y si utilizas power designer para crear tus esquemas, la herramienta te genera automaticamente el script para crear la BD.
Asi de primera mano, y sin conocer los detalles especificos de toda la base, te podria decir que CASA es una superclase con dos subclases: casa_propia y casa_arrendada.
casa_propia va a tener una relacion n-1 con Propietario (porque un propietario puede tener muchas casas) casa_arrendada va a tener una relacion n-1 con Propietario (por la misma razon anterior) y ademas va a tener una relacion 1-1 con Arrendatario.
Por el lado de PERSONA, va a tener como subclases a Propietario, Arrendatario y Habitante
Al final en el esquema fisico (y por consiguiente las tablas de la base) casa_propia va a tener como FK el PK del propietario y casa_arrendada va a tener el PK del propietario y el PK del arrendatario como foreign keys.
Habitante va a tener como FK el ID de la CASA en la que habita.
En la superclase CASA: almacenarias toda la informacion pertinente a la casa, y en la superclase PERSONA: almacenarias toda la informacion pertinente a las personas.
Yo diferiría un poco de ese diseño.
Primero: Una casa es una casa. Realmente te interesa la relación de propiedad de la casa de la persona. Yo lo haría de esta manera:
CASA // Esto contiene toda la información física de la casa, aquí no importa si es propia o arrendada ya que nuestro objeto casa representa nuestra entidad física.
PERSONA // Esta tabla simplemente lleva el registro de todas las personas, sin relacionarlas directamente a la casa:
Luego vienen las relaciones que es lo importante. Primero tendrías una tabla que sería "relacion_de_pertenencia":
PERTENENCIA // Esta tabla denota una relación, estaría hecha por una llave primaria compuesta (idcasa,idpersona,idpertenencia), idpertenencia es un catálogo que define el tipo de pertenencia (1 propia, 2 alquilada). Adicionalmente podrías agregar una tributo booleando que te permita saber si esa persona habita en esa casa.
Esta tabla te permite hacer algo interesante: Vos podes tener al propietario de la casa y al arrendatario en la misma tabla:
1,12,1,0 // propietario que no habita la vivienda
1,13,2,1 // arrendatario que habita la vivienda
Incluso podrías tener un tercer código para los habitantes:
1,16,3,1 // habitante X
Si quisieras por ejemplo, obtener todos los propietarios de la vivienda 1 (en caso fueran varios):
SELECT
PERSONA.*
FROM PERTENENCIA INNER JOIN PERSONA ON PERTENENCIA.IDPERSONA=PERSONA.IDPERSONA
WHERE IDPERTENENCIA=1 AND
IDCASA=1
Si quisieras obtener todas las personas que estan arrendando una vivienda
SELECT
CASA.*,
PERSONA.*
FROM PERTENENCIA INNER JOIN PERSONA ON PERTENENCIA.IDPERSONA=PERSONA.IDPERSONA INNER JOIN CASAON PERTENENCIA.IDCASA=CASA.IDCASA
WHERE IDPERTENENCIA=2
Si quisieras obtener todas las personas que habitan en una casa específica:
SELECT
PERSONA.*
FROM PERTENENCIA INNER JOIN PERSONA ON PERTENENCIA.IDPERSONA=PERSONA.IDPERSONA
WHERE PERSONA.HABITA=1 AND PERTENENCIA.IDCASA=1
Todo con tres tablas
Si quisieras normalizar podrías hacer catalogo para el tipo de pertenencia.
Adendo: Este modelo te permite almacenar cosas interesantes, por ejemplo si una persona arrenda varias casas no necesita habitar en la misma (tal vez las arrenda para negocio o para la otra mujer en una segunda casa o simplemente vive en el extranjero y viven los hijos en la casa). Incluso podrías almacenar casas "ocupadas" en las que ni el propietario ni el arrendador habitan la casa y solo hay "otras personas"