В настоящее время с помощью Postgres 9.3 У меня есть таблица Person(Id, FName, Lname, Address1, Adress2, phone1, phone1,....)
Лучший способ хранить неизвестное количество атрибутов
Я мог бы сделать Person(id, FName, Lname)
, а затем Address(PersonID, AddressName, Address)
и Pone(PersonID, PhoneName, Number)
Но когда, когда мне нужно, чтобы добавить новый атрибут , скажем, по электронной почте, мне нужно изменить схему и добавить Email(PersonID, EmailName, Address)
То, что я хочу сделать, это Person(ID, AtrbLbl, AtribVal)
1, Fname, Ron
1, Lname, H
1, HomeEmal, [email protected]
1, HomeAddress, 123 st edmonton
2, LName, Smith
3, Fname, Bob
2, Fname, Sam
3, Lnaem, Marly
3, HomeAdress, Heven
2, HomeAddress, abc St.
1, FavorateColor, red
2, FavorateColor, red
3, FavorateColor, red
1, FavorateIcream, Chocolate
2, FavorateIcream, Vanila
3, FavorateIcream, Mint
4, FName, tom
4, FavorateColor, blue
Где я, Рон H, я из всех ID = 1 и если, скажем, я получил работу, которую вы могли бы добавить 1, WorkEmail, [email protected]
Так что, если я хочу, чтобы все атрибуты всех, кто FavorateColor красный
Select * from person where id in (Select ID from person where AtrbLbl = FavorateColor and AtribVal = red)`
Моя проблема в поиске нескольких атрибутов. В SUDO SQL, что я хочу это
Select * from person where id in (Select id from person where (AtrbLbl = FavorateColor and AtribVal = red) AND (AtrbLbl = Fname and AtribVal = Ron)
Очевидно, что не будет работать.
То, что я думал сделать это
insert into temptbl
Select Count(id) cnt, ID from person where (AtrbLbl = FavorateColor and AtribVal = red) OR (AtrbLbl = Fname and AtribVal = Ron)
Select * From person where id in (select id from temtbl where cnt = 2) order by id
where 2 is the number of searched attributes.
Так что, если я хотел лиц, которые, как красный, шоколад и FName Рон
insert into temptbl
Select Count(id) cnt, ID from person where (AtrbLbl = FavorateColor and AtribVal = red) OR (AtrbLbl = Fname and AtribVal = Ron) OR (AtrbLbl = FavorateIcream and AtribVal = Chocolate)
Select * From person where id in (select id from temtbl where cnt = 3) order by id
На мой взгляд, я должен быть в состоянии сделать это в на утверждение, объединяя результаты от одной части того, где к результатам другой части.
Может ли кто-нибудь подумать о одном утверждении, которое может это сделать? Или более элегантный метод?
Базы данных NoSQL в основном предназначены для этого.Возможно, вы захотите изучить один из них, если это общая проблема, с которой вы сталкиваетесь. SQL лучше всего работает с определенной схемой. – MartianCodeHound
Я укажу, что это пример того, что я пытаюсь сделать. В моем реальном тесте у меня есть Лицо с базовым набором столбцов, таких как Имя и день рождения, и таблица personAttributes, где все остальные атрибуты, и я думаю, что у меня будет таблица AttributeLable для хранения всех уже определенных меток, чтобы я не например, глаз и глаз. –
@MartianCodeHound Я бы хотел переключиться на один, я посмотрел на него, и вы на 100% прав, это путь, но у меня есть другие ограничения. Мне интересно узнать, как другие люди нарушили SQL, чтобы выполнить такую работу. –