Lo primero que haría es recomendar usar un ORM como Linq-To-Sql o NHibernate lo que le brindará representaciones de objetos de su modelo de datos que simplifican mucho el manejo de cosas complejas como operaciones CRUD de muchos a muchos.
Si un ORM no es parte de su conjunto de herramientas, así es como se vería en SOL.
Users UserAddresses Addresses
======= ============= =========
Id Id Id
FirstName UserId City
LastName AddressId State
Zip
Nuestras tablas se unen así:
Users.Id -> UserAddresses.UserId Addresses.Id -> UserAddresses.AddressId
- Todos los registros en Usuarios basados en Direcciones.Id
SELECT Users.*
FROM Addresses INNER JOIN
UserAddresses ON Addresses.Id = UserAddresses.AddressId INNER JOIN
Users ON UserAddresses.UserId = Users.Id
WHERE (Addresses.Id = @AddressId)
- Todos los registros en Direcciones basados en Users.Id
SELECT Addresses.*
FROM Addresses INNER JOIN
UserAddresses ON Addresses.Id = UserAddresses.AddressId INNER JOIN
Users ON UserAddresses.UserId = Users.Id
WHERE (Users.Id = @UserId)