2016-04-05 6 views
1

У меня есть пример база данных следующим образом:Realm Database Design

class Company:Object { 
    dynamic var companyName = "" 
    let employees = List<Employee>() 
} 

class Employee:Object { 
    dynamic var companyName = "" // Is this required? 
    dynamic var name = "" 
    dynamic var age = "" 
} 

ли companyName свойства в классе Employee необходимого? Если не так, как бы я ссылался на сотрудников, принадлежащих конкретной компании в запросе.

+0

оффтоп : Это должно быть имя вместо companyName для хорошего дизайна, потому что вы уже находитесь внутри объекта компании, и все знают, что этот атрибут принадлежит компании. – Xatenev

+0

* Это необходимо? * Вы решаете. * Может понадобиться это позже? * Вероятно. Это может быть полезно, если вы подумали о дизайне реляционным способом; чтобы узнать, какие общие атрибуты должны быть разделены. –

+0

@ Xatenev С таким же именем лучше. Подумайте об этом как о внешнем ключе. –

ответ

1

Вы можете использовать linkingObjects особенность Realm для этой цели, как это:

class Company:Object { 
    dynamic var companyName = "" 
    let employees = List<Employee>() 
} 

class Employee:Object { 
    dynamic var name = "" 
    dynamic var age = "" 
    var company: Company? { 
     return linkingObjects(Company.self, forProperty: "employees").first 
    } 
} 

Такой подход позволяет сэкономить усилия, чтобы сохранить свойство COMPANYNAME вашего объекта сотрудника точной, и это также экономит пространство, поскольку компания здесь не хранится , Если вы выбираете этот путь, вы можете получить объект компании ваших сотрудников легко, как это: (это возвращает ноль, если работник не связан с какими-либо компаниями)

let aCompany = someEmployee.company 

И ответить на ваш вопрос

Если не так, как я бы ссылался на сотрудников, принадлежащих конкретной компании в запросе.

у вас уже есть способ сделать это, так как хранить служащему компании в ее списке employees, так что вы можете использовать это свойство, как это, чтобы получить сотрудников, которые принадлежат компании:

let aCompanysEmployees = someCompany.employees 
+0

Как бы это сделать, используя фильтр области. Скажем, я хочу найти сотрудника в возрасте 60 лет и принадлежит компании ABC. Причина с 'companyName' в классе' employee', я буду делать что-то вроде 'filter (" companyName = 'ABC' и age = 60 ")' – John

+0

Если бы я был вами, я бы установил 'companyName' в качестве первичного ключа для вашего 'Company', а затем сделайте что-то вроде этого:' if let company = realm.objectForPrimaryKey (Company.self, key: «ABC») { let oldEmployees = company.employees.filter ("age = 60") } ' – bcamur